二、指標是什麼東西
想說弄懂你不容易啊!我們許多初學指標的人都要這樣的感慨。我常常在思索它,為什麼呢?其實生活中處處都有指標。我們也處處在使用它。有了它我們的生活才更加方便 了。沒有指標,那生活才不方便。不信?你看下面的例子。
這是一個生活中的例子:比如說你要 我借給你一本書,我到了你宿舍,但是你人不在宿舍,於是我把書放在你的2層3號的書架上,並寫了一 張紙條放在你的桌上。紙條上寫著:你要的書在第2層3號的書架上。當你回來時,看到這張紙條。你就 知道了我借與你的書放在哪了。你想想看,這張紙條的作用,紙條本身不是書,它上面也沒有放著書。 那麼你又如何知道書的位置呢?因為紙條上寫著書的位置嘛!其實這張紙條就是一個指標了。它上面的 內容不是書本身,而是書的地址,你通過紙條這個指標找到了我借給你的本書。
那麼我們C,C++ 中的指標又是什麼呢?請繼續跟我來吧,看下面看一個申明一整型指標變數的語句如下:
int * pi;
pi是一個指標,當然我們知道啦,但是這樣說,你就以為pi一定是個多麼特別的東西了。其 實,它也只過是一個變數而已。與上一篇中說的變數並沒有實質的區別。不信你看下面圖。
記憶體 地址→6 7 8 9 10 11 12 13 14
--------------------------------------------------------------
...| 30 | ‘t’ | | | | | | |……
--------------------------------------------------- -----------
變數 |→i ←|→a ←| |→ pi ←|
(說明:這裡我假設了指標只佔2個位元組寬度,實際上在32位系統中,指標的寬度 是4個位元組寬的,即32位。)由圖示中可以看出,我們使用int *Pi申明指標變數; 其實是在記憶體的某處 申明一個一定寬度的記憶體空間,並把它命名為Pi.你能在圖中看出pi與前面的i,a 變數有什麼本質區別 嗎,沒有,當然沒有!pi也只不過是一個變數而已嘛!那麼它又為什麼會被稱為指標?關鍵是我們要讓 這個變數所儲存的內容是什麼。現在我要讓pi成為真正有意義上的指標。請接著看下面語句:
pi=&i;
你應該知道 &i是什麼意思吧!再次提醒你啦:這是返回i變數的地址編 號。整句的意思就是把i地址的編號賦值給pi,也就是你在pi上寫上i的地址編號。結果如下圖所示:
記憶體位址→6 7 8 9 10 11 12 13 14
------------------------------------------------------------------
...| 30 | ‘t’ | | | 6 | | |……
----------------------------------------------- -------------------
變數 |→i ←|→a ←| |→ pi ←|
你看,執行完pi=&i;後,在圖示中的系統中,pi的值是6.這 個6就是i變數的地址編號,這樣pi就指向了變數i了。你看,pi與那張紙條有什麼區別?pi不就是那張紙 條嘛!上面寫著i的地址,而i就是那個本書。你現在看懂了嗎?因此,我們就把pi稱為指標。所以你要 記住,指標變數所存的內容就是記憶體的地址編號!好了,現在我們就可以通過這個指標pi來訪問到i這個 變數了,不是嗎?。看下面語句:
printf(“%d”,*pi);
那麼*pi什麼意 思呢?你只要這樣讀它:pi內容所指的地址的內容(嘻嘻,看上去好像在繞口令了),就pi這張“ 紙條”上所寫的位置上的那本 “書”——i .你看,Pi內容是6,也就是說 pi指向記憶體編號為6的地址。*pi嘛!就是它所指地址的內容,即地址編號6上的內容了。當然就是30的值 了。所以這條語句會在螢幕上顯示30.也就是說printf(“%d”,*pi);語句等價於printf ( “%d”, i ) ,請結合上圖好好體會吧!各位還有什麼疑問,可以發Email: yyf977@163.com.
到此為止,你掌握了類似&i , *pi寫法的含義和相關操作嗎。總的一句話 ,我們的紙條就是我們的指標,同樣我們的pi也就是我們的紙條!剩下的就是我們如何應用這張紙條了 。最後我給你一道題:
程式如下
char a,*pa
a=10
pa=&a
*pa=20
printf( “%d”, a)
你能直接看出輸出的結果是什麼嗎?如 果你能,我想本篇的目的就達到了。好了,就說到這了。Happy to Study!在下篇中我將談談“指 針的指標”即對int * * ppa;中ppa 的理解。