《C與指標》讀書筆記

御史大夫發表於2012-10-05

第六章

 

6.1.  記憶體和地址

獲得一個值的地址,就能根據這個地址獲得這個值,但如果程式設計時直接使用地址訪問值,是非常繁瑣的,所以高階語言使用名字而非地址訪問記憶體的位置,這些名字就是我們程式設計者所使用的變數。變數名和記憶體位置之間的關聯是編譯器提供的,為程式設計者所使用。而電腦硬體依舊使用地址訪問記憶體位置。

 

6.4. 間接訪問操作符

通過指標訪問他所指向的記憶體地址稱為“間接訪問”或“解引用指標”,用於進行間接訪問的操作符是單目運算子*。

比如指標p的值是100,即它儲存的地址(指向的地址)是100,對p使用間接訪問操作符*時,就是訪問記憶體地址100並察看那裡存放的值。如果記憶體100存放的值是112,那麼*p 就等於112.

 

6.6. NULL指標

NULL指標作為一個特殊的指標變數,表示不指向任何東西。注意NULL是一個指標變數而不是一個值。要使得一個指標成為NULL指標,可以賦值以0.

對指標進行解引用操作(即“*”)可以獲得他所指向的值,但NULL指標並不指向任何東西,因此對NULL進行解引用操作是非法的(但機器未必會做出提醒),在對指標進行解引用操作時必須判斷它是否為NULL指標。

 

6.8. 指標、間接訪問和變數

&a是變數a的地址,是一個指標常量。對於指令*&a = 25,先通過&獲得a的地址,再對a的地址進行解引用操作,並賦值25,實際上等效於a = 25.

 

6.9. 指標常量

假設變數a的地址是100,那麼語句*100 = 25的功能是什麼?把25賦值給a?

這是錯誤的!這條語句實際上是非法的,因為編譯器會把“100”看做是一個普通的整型數值而非一個地址!而間接訪問操作符*只能用於指標型別表示式身上。如果確實像把25儲存到地址100中(實際上是儲存到以地址100為開端的一片記憶體區域中,這片記憶體區域的大小視乎“25”所屬的數值型別,比如25為int型的話,就是4),就要進行強制型別轉換。以下指令是合法的。

*(int*)100 =  25;

上述語句將100由“整型”轉為“指向整型的指標”,這樣對它進行間接訪問就是合法的了。

 

                                                                                                                          >>未完

相關文章