推 RebeccaHall:回得好仔細~!! 11/29 18:01
本文回給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