看板 C_and_CPP 關於我們 聯絡資訊
本文回給VictorTom:因為想說的頗多, 所以就不洗推文了 首先, 謝謝你的指教@@ 1. :我覺得您自己先把pointer和address給分清楚再說 請問你認為是哪邊不夠清楚呢? 2. :文中一堆"指標"字眼用的位址很奇怪 請問你認為哪邊使用上很奇怪呢? 3. :還有, 個人覺得你C++的傳址的觀念有問題 恩, 我大概描述一下我的觀念, 請你再指教一下好嗎?@@ 以一個 int a = 10; 這樣的宣告來說 我認為是宣告了一塊記憶體位址, 存放了10這個值 比較具像的表示是 變數名稱a 變數內容10 變數位址0x123456 大致上是這樣的 而我若宣告了一個int b; 然後寫上 b = a; 這是為一種傳遞"值"的拷貝動作 電腦會將a的值, 複製一份給b 而如果寫成 int* b = &a;的話 視為一種傳址的動作 從此a跟b兩個變數的記憶體位址 同時指向0x123456這個位置上 因此, 無論改變哪個變數 另一個都會同步改變, 因為他們都是同一個記憶體位置 4. :嚴格來說, char *s=&str[0]; 是一個傳值的動作, 它是把str[0]的address傳值到s去; 在這裡我看見的是指標的傳遞說@@ 請問哪本書教你 pointer variable = &variable; 這樣的寫法是傳值而非傳指標呢?@@ 我想去拜讀一下 我能猜到你大概是這樣想的 這裡我們都明白, char* s; 宣告了一個空指標, 沒內容, 隨機在記憶體內取一個沒用到的空間, 所以把&str[0];的記憶體位址填寫進這個指標內 而如果你認為的傳值傳址議題 不是在討論, 傳遞指標, 還是傳遞內容值的話 那只能說我們都沒啥錯, 只是因為在受教育的時候 我就根深蒂固的學習了老師那派的看法 只要是傳遞指標, 就是看成一種傳址 5. :除非宣告的是函數int swap(int &a, int &b); :通常這種我們才在討論傳址呼叫; 想請問您覺得int swap(int *a, int *b); :是傳值還是傳址?? 那個, 請問"我們"是指哪個團體? you and me? or ...? 如果是某個超有成就的學術單位, 還請務必賞賜個網址來給在下拜讀一番@@ 就你所寫的兩個函式原型來說呢 我的理解是第一個是收兩個"參考值"reference 第二個收的兩個是"指標"pointer 第一個函式放進去的是兩個參考變數 不過參考我很少在用, 理解不夠清澈 這裡就請其他前輩賜教了@@ 第二個函式放進去的, 是兩個"指標變數" 這兩個指標變數的大小都是一樣的(應該說, 所有指標變數的大小都一樣) 都是4byte, 然後這個指標變數存的"值", 是另一個變數的記憶體位址 沒錯, 這兩個函式的最終結果都一樣, 會是記憶體位址的互換 但是, 用台語的說法就是: 一樣就不同師父勒 一個是參考的交換, 一個是指標的交換 然後最終的成果都是指向的記憶體目標交換 即原本a 指向12345, b 指向67890 變成了a 指向67890, b 指向12345 但是實際上的記憶體位置是沒有變動低@@ 不知道我這樣解釋夠不夠清楚?@@ 5. :利用指標操作另一個陣列本來就是在學習 :pointer/array/address時的基本功, 也是應該搞清楚的地方 :原原po應該在這邊把指標的觀念慢慢開始摸懂, :而不是因為這樣什麼傳值傳址的不要這樣寫....~_~ 如果你認為char這個比較模糊的地帶 是很適合新手練習指標觀念的地帶的話 那我也沒什麼好說了@@ 不過我是認為用些比較直觀的型態來教指標觀念會比較好 比如說 int a = 10; int* pA = &a; 這樣比較淺顯的東西 如果要教指標與陣列的關係 int a = 10, b = 20, c = 30, d = 40; int Ace[4] = {a, b, c, d}; cout << *(Ace+0) << endl; cout << *(Ace+1) << endl; cout << *(Ace+2) << endl; cout << *(Ace+3) << endl; 這樣不知道會不會比較好一點 喔, 對了, 我的習慣是, 我張貼的程式碼 一定有經過VC2008編譯器的確認@@ 不會憑空亂寫... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.133.240
RebeccaHall:回得好仔細~!! 11/29 18:01