二、指針是什麼東西
想說弄懂你不容易啊!我們許多初學指針的人都要這樣的感慨。我常常在思索它,為什麼呢?其實生活中處處都有指針。我們也處處在使用它。有了它我們的生活才更加方便 了。沒有指針,那生活才不方便。不信?你看下面的例子。
這是一個生活中的例子:比如說你要 我借給你一本書,我到了你宿捨,但是你人不在宿捨,於是我把書放在你的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: [email protected].
到此為止,你掌握了類似&i , *pi寫法的含義和相關操作嗎。總的一句話 ,我們的紙條就是我們的指針,同樣我們的pi也就是我們的紙條!剩下的就是我們如何應用這張紙條了 。最後我給你一道題:
程序如下
char a,*pa
a=10
pa=&a
*pa=20
printf( “%d”, a)
你能直接看出輸出的結果是什麼嗎?如 果你能,我想本篇的目的就達到了。好了,就說到這了。Happy to Study!在下篇中我將談談“指 針的指針”即對int * * ppa;中ppa 的理解。