天天看點

C語言指針導學(1)——指針到底是什麼

一.指針到底是什麼

指針(pointer)到底是什麼,弄清楚這個問題很重要,這是我們所讨論的話題的源頭,而在闡述指針是什麼之前,我們需要先來看一下變量的概念。

我們知道,計算機的記憶體(primary storage)被劃分為多個存儲單元,這些存儲單元可以以單個或者順序相連組成一個更大單元的方式被使用。每一個單獨的存儲單元都是一個位元組(byte),它通常由8個位(bit)組成,每一個位可以表示的值隻有0或1。每一個存儲單元都被一個及其配置設定的辨別唯一地表示,而這個辨別就是位址。

下圖表示了存儲單元單獨被操作時的情形,矩形表示存儲單元,矩形内的内容是存儲在這個記憶體單元的具體的值。矩形上方的數就是每個記憶體單元的位址。因為每個單元為一個位元組,而每個字元型常量(character constant)所占據的正是一個位元組,如下所示:

C語言指針導學(1)——指針到底是什麼

再來看下面的圖:

C語言指針導學(1)——指針到底是什麼

這次的情況是順序連成組進行操作,對于整型常量(integer constant),在32位計算機中需要四個位元組來存儲(有一點要聲明,208位置的那個矩形裡的1078345超出了int類型的範圍,是long int類型,但ANSI C隻規定了long型資料長度不小于int型,int型資料長度不小于short型,并規定int型為16位,long型為32位,然而很多編譯器采取的政策是使long和int型資料占據相同的記憶體位元組數,即全為32位),是以位址以4個機關增長(也就是說現在的一個矩形表示4個記憶體單元),這次矩形下面多了幾個小寫字母,存儲在矩形裡面的值不是固定唯一的,而是可變的。我們可以把矩形認為是一個變量(variable),每次我們要引用矩形裡的值時,機器都是通過位址來定位(那個矩形)并取得其中的值的,而對于我們來說要記住這些位址幾乎是不可能的,是以進階語言提供了用名字來通路記憶體位置的特性,它們就是變量名,即上圖的a,b,c,d。

現在用變量名替換掉上圖中的位址:

C語言指針導學(1)——指針到底是什麼

大家要注意,變量名與位址的關聯是由編譯器為我們實作的,具體的實作方式我們無需關心,但要清楚硬體仍然是通過位址通路記憶體位置的。接下來,繼續看圖:

C語言指針導學(1)——指針到底是什麼

來看新增的Ptr,同樣是個變量,它也有位址,它的值是變量a的位址。至此可以給出指針的定義了:指針是一種用于存放另一個變量的位址的變量。上圖中的Ptr就是一個指針,并且我們說它指向了變量a(因為Ptr的值是變量a的位址),要注意指針中隻能存放位址,不能将一個整型量或者其他非位址類型(整型數0及具有0值的整形常量表達式除外,後面的文章會細緻講解)的資料賦給一個指針!

還有,指針這個詞,由于是對pointer這個詞翻譯得來,完整的叫法應該是指針變量,由于指針變量中存的位址,而在大多數外國資料中,指針(pointer)的涵義不完全都是指針變量,有時也指位址,請大家在閱讀或參考資料時注意區分!

(注:本将及後續章節中用以表示記憶體的矩形中的值在實際中是以二進制數表示的,位址是以十六進制數表示的,文章中隻是為了簡潔易讀進而采用十進制數表示。)

前言

2.指針的定義及運算

3.指針與數組的“愛恨情仇”

4.厘清函數指針和指針函數

5.指針與結構

6.使用指針時的“陷阱”

後記