天天看點

C語言:C語言指針的概念

在計算機中,所有的資料都是存放在存儲器中的。一般把存儲器中的一個位元組稱為一個記憶體單元,不同的資料類型所占用的記憶體單元數不等,如整型量占2個單元,字元量占1個單元等。為了正确地通路這些記憶體單元,必須為每個記憶體單元編上号。根據一個記憶體單元的編号即可準确地找到該記憶體單元。 記憶體單元的編号也叫做位址。既然根據記憶體單元的編号或位址就可以找到所需的記憶體單元,是以通常也把這個位址稱為指針。  

記憶體單元的指針和記憶體單元的内容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關系。我們到銀行去存取款時,銀行從業人員将根據我們的帳号去找我們的存款單, 找到之後在存單上寫入存款、取款的金額。在這裡,帳号就是存單的指針, 存款數是存單的内容。 對于一個記憶體單元來說,單元的位址即為指針,其中存放的資料才是該單元的内容。

在C語言中,允許用一個變量來存放指針,這種變量稱為 指針變量 。是以,一個指針變量的值就是某個記憶體單元的位址或稱為某記憶體單元的指針。

圖中,設有字元變量C,其内容為“K”(ASCII碼為十進制數 75),C占用了011A号單元(位址用十六進制數表示)。設有指針變量P,内容為011A,這種情況我們稱為 P指向變量C ,或說 P是指向變量C的指針 。

嚴格地說,一個指針是一個位址,是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變量。但常把指針變量簡稱為指針。為了避免混淆,我們中約定:“指針”是指位址,是常量,“指針變量”是指取值為位址的變量。定義指針的目的是為了通過指針去通路記憶體單元。

既然指針變量的值是一個位址,那麼這個位址不僅可以是變量的位址,也可以是其它資料結構的位址。在一個指針變量中存放一個數組或一個函數的首位址有何意義呢?

因為數組或函數都是連續存放的。通過通路指針變量取得了數組或函數的首位址,也就找到了該數組或函數。這樣一來,凡是出現數組,函數的地方都可以用一個指針變量來表示,隻要該指針變量中賦予數組或函數的首位址即可。這樣做,将會使程式的概念十厘清楚,程式本身也精練,高效。

在C語言中,一種資料類型或資料結構往往都占有一組連續的記憶體單元。用“位址”這個概念并不能很好地描述一種資料類型或資料結構,而“指針”雖然實際上也是一個位址,但它卻是一個資料結構的首位址,它是“指向”一個資料結構的,因而概念更為清楚,表示更為明确。 這也是引入“指針”概念的一個重要原因。

繼續閱讀