記憶體與指標

指標(pointer)

指標(pointer)回答的是「它在哪裡?」而不是「它是什麼?」。如果說變數是一個裝著值的盒子,那麼指標就是一個裝著「另一個盒子位址」的盒子。它像一張寫著門牌號碼的紙條:紙條不是房子,但它精確地告訴你去哪裡找那間房子。

具體而言,指標是一個「其值為某個位址」的值,存放在一個剛好夠裝下位址的變數裡(典型 64 位元機器上,任何指標型別都是 8 位元組)。宣告成 int *p,變數 p 就持有某個 int 的位址。你用取址運算子取得位址:p = &x;再用解參考運算子 *p 抵達它所指的東西——也就是「被指物」(pointee)。讀 *p 會取回住在那個位址的 int;寫 *p = 7 會把 7 存到那裡。指標和它的被指物是兩個不同的物件:改 p(它指向哪裡)和改 *p(那邊的值)是兩回事。

指標是 C 的核心,因為它讓一段程式碼能指稱另一段程式碼所擁有的記憶體:不複製就傳遞一個大陣列、讓函式修改呼叫者的變數、把節點串成一個串列、或持有一塊來自堆積的記憶體。它們也是大多數 C 臭蟲的棲身之處——指向已被釋放或從未設定過的記憶體的指標會指到無意義的地方,使用它就是未定義行為。一個指標的可信度,完全等於它裡面那個位址的可信度。

int x = 10; int *p = &x; *p = 20; ——現在 x 是 20,因為 p 持有 x 的位址,而 *p = 20 透過它寫了進去。p 本身只是持有像 0x7ffd... 這樣的一個號碼;*p 抵達那邊那個 int。

p 儲存 x 在哪裡;*p 抵達 x 的值。

把指標傳給函式,傳的仍然是「位址這個值」——C 把位址複製進參數。函式無法改變呼叫者的指標指向哪個盒子,但它可以透過 *p 改變被指物。指標不是物件本身;它是一個定位物件的號碼。

又稱
pointer variable指標變數