記憶體與指標

記憶體位置與可定址性

記憶體位置(memory location)是記憶體中某個值所住的特定地點——一個盒子,或一連串相鄰、合起來裝一個物件的盒子。可定址性(addressability)就是這個簡單的事實:這樣一個地點有一個你叫得出來的位址,你可以指向它、取得它的位址,之後再回來找它。

C 中的每個物件——一個變數、一個陣列元素、一個結構的欄位——在它存活期間都佔據一個確定的位置,而那個位置有一個起始位址。可定址的最小單位是一個位元組:你可以指名 0x1000 這個位元組,但不能直接指名「0x1000 這個位元組的第三個位元」。像 double 這樣較大的物件坐落在一個起始位址,從那裡橫跨好幾個連續位元組。有些東西刻意「不可定址」:只存在 CPU 暫存器裡的值,或被編譯器最佳化掉的變數,沒有穩定的位址;而 C 的位元欄位(bit-field)是經典的「幾乎可定址」案例——你能讀它寫它,卻不能用 & 取得它的位址。

可定址性是從「一個值」通往「一個指向那個值的指標」的橋樑。& 與 * 的整套機制、陣列、堆疊與堆積,全都建立在一個假設上:記憶體中的東西有可以用號碼指稱、並能再次造訪的位置。

struct point { int x, y; } p; 這裡 p 有一個位置,p.y 在它內部的已知偏移處也有;&p.y 合法。但對 struct { unsigned flag : 1; } b; 來說,位元欄位 b.flag 沒有位址——&b.flag 會是編譯錯誤。

大多數物件可定址;位元欄位是值得記住的例外。

活著時有位置,不等於永遠保有它:區域變數的位置在它的範圍結束後就會被重用,所以剛剛還有效的位址可能變成懸置指標。可定址性講的是「能被指名」,不是「永遠有效」。

又称
object location記憶體位置