C語言指標導學(1)——指標到底是什麼
一.指標到底是什麼
指標(pointer)到底是什麼,弄清楚這個問題很重要,這是我們所討論的話題的源頭,而在闡述指標是什麼之前,我們需要先來看一下變數的概念。
我們知道,計算機的記憶體(primary storage)被劃分為多個儲存單元,這些儲存單元可以以單個或者順序相連組成一個更大單元的方式被使用。每一個單獨的儲存單元都是一個位元組(byte),它通常由8個位(bit)組成,每一個位可以表示的值只有0或1。每一個儲存單元都被一個及其分配的標識唯一地表示,而這個標識就是地址。
下圖表示了儲存單元單獨被操作時的情形,矩形表示儲存單元,矩形內的內容是儲存在這個記憶體單元的具體的值。矩形上方的數就是每個記憶體單元的地址。因為每個單元為一個位元組,而每個字元型常量(
再來看下面的圖:
這次的情況是順序連成組進行操作,對於整型常量(integer constant),在32位計算機中需要四個位元組來儲存(有一點要宣告,208位置的那個矩形裡的1078345超出了int型別的範圍,是long int型別,但ANSI C只規定了long型資料長度不小於int型,int型資料長度不小於short型,並規定int型為16位,long型為32位,然而很多編譯器採取的策略是使long和
現在用變數名替換掉上圖中的地址:
大家要注意,變數名與地址的關聯是由編譯器為我們實現的,具體的實現方式我們無需關心,但要清楚硬體仍然是通過地址訪問記憶體位置的。接下來,繼續看圖:
來看新增的Ptr,同樣是個變數,它也有地址,它的值是變數a的地址。至此可以給出指標的定義了:指標是一種用於存放另一個變數的地址的變數。上圖中的Ptr就是一個指標,並且我們說它指向了變數a(因為Ptr的值是變數a的地址),要注意指標中只能存放地址,不能將一個整型量或者其他非地址型別(整型數0及具有0值的整形常量表達式除外,後面的文章會細緻講解)的資料賦給一個指標!
還有,指標這個詞,由於是對pointer這個詞翻譯得來,完整的叫法應該是指標變數,由於指標變數中存的地址,而在很多英文資料中,指標(pointer)的涵義不完全都是指標變數,有時也指地址,請大家在閱讀或參考資料時注意區分!
(注:本章及後續章節中用以表示記憶體的矩形中的值及其地址只是為了簡潔易讀從而採用十進位制數表示。)