雖然說是愛恨情仇,但是在一知半解的時候,其實可能仇恨比較多啦!(  ̄ c ̄)y▂ξ 但是一些高手在寫到大型程式的時候,想要減少浪費的記憶體空間,這時候就會深深的愛上了指標哩!想當初我小大一的時候,只要看到星號(*)與連結號(&),心情就非常的恐慌,很害怕這些符號背著我搞了什麼花樣…
當然,這些事情就跟變魔術一樣,看似神奇,說破了可能就不值錢了。\( ̄ ̄;)
不過先聲明,我還沒完全看透…( ̄□ ̄|||)a
所以就歡迎大家多多指教了。
一個最重要個概念是 值 與 址 的差別。
先來看最基本的狀況,比如說這個簡單的例子…
1:
2: #include <iostream>
3: using namespace std;
4:
5: int main(){
6:
7: cout << "Test Pointer!!!" << endl;
8:
9: int k = 10;
10: cout << k << endl; //10
11: cout << &k << endl; //0x22ff44
12: //cout << *k << endl; ERROR
13:
14: int m = 20;
15: int *p = &m;
16: cout << m << endl; //20
17: //cout << *m << endl; ERROR
18: cout << &m << endl; //0x22ff40
19: cout << p << endl; //0x22ff40
20: cout << *p << endl; //20
21: cout << &p << endl; //0x22ff3c
22:
23: system("PAUSE");
24: return 0;
25:
26: }
# 宣告k以後,我們可以用&讀取k的位址,但是無法使用*的符號,會產生錯誤喔!^^
# 宣告m以後,同理,我們可以列印出 m 與 &m的東西,但是一樣不可以讀出 *m。
# 因此,我們又宣告了一個指標稱為p,指向m (這句話很抽象orz)。
列印 p 時,我們得到的是 m的位址。
列印 *p時,我們得到的是 m的內容。
列印 &p時,我們得到的是 p的位址。
因此,我們可以用一些想像力來亂掰…
k 這個人叫做King,她住在0x22ff44的這個地方,家裡存著10w元。
接著,m這個人叫做Mother,她住在0x22ff40這個地方,家裡存著20w元,看得出來兩個人是鄰居XD。
有一天,匿名p,名為peter的人,他是Mother家的保全,他家的住址在0x22ff3c,可是平常要在Mother家上班。
p 因此當別人問他,你的工作內容是什麼?他會回答:「在Mother家當保全,0x22ff40。」
*p 當別人又問他,你平常工作的地方那有多少錢?他會回答:「20w。」(這不是秘密嗎?Orz」)
&p 最後又會問他,那你家在哪?他會回答:「0x22ff3c。」
接著,後面還有更複雜的,但是因為我的程度目前只有到這裡混口飯吃。
下次的愛恨情仇在繼續寫下去…
謝謝您的評論, 覺得C跟C++在pointer跟pass by value的這些基礎部份非常像, 而C++剛接觸, 未來會做更深入的了解, 謝謝您~
嗯嗯!這部分的確非常像。
我當初拿C來理解C++,其實反而會錯過一些C++特有的特性。
當初寫了好久的類C版C++,反而將物件導向的觀念棄而不用。
直到後來學會將C++了解透徹後,才更清楚這語言的特性。
希望我們都能進步!一起加油~
您好,
前陣子看到您的QT文章, 覺得不錯, 最近也對指標有所了解, 來分享下
個人覺得指標的操作重點在於value跟address(pointer)的轉換, 如何從address取到value及從value取到address; 而pointer的功用在function call時可以看出來, 因為C/C++參數傳遞方式預設是pass by value, 所以一個class object傳進去function中也是會有個copy, 沒有辦法影響到function scope外面原本的class obj, 這時候就要透過傳入pointer來改變它
一點想法, 有錯還請您指教
哈哈 很感謝妳的補充分享!:) 我相信一定會對某些人有幫助的。
int / int* /int & …?
是說你上面例子中的變數取值/址的概念嗎 @@
版主回覆:(12/04/2011 03:44:04 PM)
假如一個函式長這樣。
void Tea_Party(int){
//balabala
};
void Tea_Party(int*){
//balabala
};
void Tea_Party(int&){
//balabala
};
這三個之間有什麼差別呢?
int 是傳一個整數給他,會複製一份再丟進去。
int*是傳一個整數指標給他。
int&是傳一個變數的別名給他,位址,不會再多複製一份。
印象中是這樣,還沒有很純熟,不是很確定!XD
哈哈 指標這東西 超害怕的
和你一樣看到*和&就會昏~ XD
不過這篇基本概念有介紹到耶 謝謝拉 ~~
版主回覆:(12/02/2011 01:41:33 PM)
是啊!Q__________Q 而且我最近才搞懂,還有int, int*, int&,放入參數傳遞的這些東東。
唉唉~~~因為Link List算是資料結構當中的基礎,但他的基礎就是指標,所以遲早要面對的。
指標→鏈結串列→Graph (or Tree)之類的。希望我早日克服目前的程度,趕快變強,就可以快速寫完程式然後畢業啦!哈哈 很高興對你有幫助,我也因為寫一些程式筆記,比自己單純的讀,觀念變得比較容易清楚了。