♥ 學習筆記Learning 程式語言 Coding

[C++程式設計] 學習筆記-與指標的愛恨情仇-楔子

雖然說是愛恨情仇,但是在一知半解的時候,其實可能仇恨比較多啦!(  ̄ c ̄)y▂ξ 但是一些高手在寫到大型程式的時候,想要減少浪費的記憶體空間,這時候就會深深的愛上了指標哩!想當初我小大一的時候,只要看到星號(*)與連結號(&),心情就非常的恐慌,很害怕這些符號背著我搞了什麼花樣…

pixel_maggic

當然,這些事情就跟變魔術一樣,看似神奇,說破了可能就不值錢了。\( ̄ ̄;)

不過先聲明,我還沒完全看透…( ̄□ ̄|||)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。」

接著,後面還有更複雜的,但是因為我的程度目前只有到這裡混口飯吃。
下次的愛恨情仇在繼續寫下去…

About the author

蕾咪

蕾咪,來自台東,卻不定期旅居歐洲的工程師女孩,身兼作家、部落客、創業家等多重身份。畢業於台大電子所,曾在義大利商與美商擔任研發工程師;走訪世界後,發現對台灣有段割捨不了的愛,讓我們一起努力成為想要的自己吧!:) 合作邀稿請聯繫:[email protected]

6 Comments

  • 謝謝您的評論, 覺得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)之類的。希望我早日克服目前的程度,趕快變強,就可以快速寫完程式然後畢業啦!哈哈 很高興對你有幫助,我也因為寫一些程式筆記,比自己單純的讀,觀念變得比較容易清楚了。

Leave a Comment