記憶體與指標
解參考(*)
如果指標是一張寫著門牌號碼的紙條,那麼解參考(dereference)就是真的走到那間房子、往裡面看的動作。解參考運算子是單一個星號 *:把它放在指標前面,你得到的就是「指標所持位址處所住的值」,而不是位址本身。
所以對 int *p = &x 來說,名字 p 代表「那個位址」,而 *p 代表「那邊那個 int」。*p 可讀(int y = *p; 把 x 的值複製出來)也可寫(*p = 9; 把 9 存進 x)。指標的型別決定解參考的行為:對 double * 做 *p 會把 8 個位元組讀成 double,對 char * 做 *p 則讀 1 個位元組。指向結構的指標有個簡寫 p->field,意義同於 (*p).field。一個細微但重要的點:int *p 中的星號是宣告的一部分(表示「p 是指標」),而 *p = 9 中的星號是正在工作的解參考運算子——同一個符號,兩種角色。
解參考是指標展現價值之處,也是它咬人之處。*p 只有在 p 真的指向一個你被允許碰觸的存活物件時才有效。解參考空指標、懸置指標,或未初始化的野指標都是未定義行為——常常是記憶體區段錯誤,但有時是一場悄悄的毀損,在很遠的地方才浮現。
int x = 3; int *p = &x; printf("%d\n", *p); 印出 3,接著 *p += 10; 讓 x 變成 13。p 從未改變——它仍指向 x——但 *p 伸進去修改了 x。
*p 讀寫被指物;p 本身保持不動。
絕不要解參考一個你沒確認指向有效位置的指標。永遠檢查配置的結果;而呼叫 free() 之後指標就懸置了——即使那些位元組看起來沒變,*p 仍是未定義的。當掉算是幸運的結局;悄悄的毀損才是不幸的那一種。
又称
另见