記憶體與指標
位址與定址空間
如果記憶體是一條編了號盒子的街道,那麼位址(address)就只是某個盒子上的號碼——它告訴你某個位元組「住在哪裡」,而不是裡面裝了什麼。從第一個盒子到最後一個盒子的整個有效號碼範圍,就是定址空間(address space):程式被允許談論的所有位址的完整集合。
位址本身是一個普通的整數,通常寫成十六進位,因為這樣和位元組對得很整齊,例如 0x7fffe3a04c10。在 64 位元機器上,一個位址有 64 位元寬,所以原則上定址空間從 0x0 一路到約 16 EB 的上限,雖然真正的程式永遠只用到其中零散的一小撮。C 程式執行時,它看到的位址是虛擬的:作業系統給每個行程一份自己私有、從頭編起的號碼,所以兩個程式都可以「用 0x1000 這個位址」而互不衝突。
位址之所以重要,是因為指標不過就是被存起來的一個位址。要傳遞、比較或保存一個位置,你保存的就是它的號碼。0 之所以特殊(也就是空指標),純粹是一個慣例:位址 0 被保留來代表「不指向任何東西」,而作業系統刻意讓它沒有對映,於是誤觸那裡會大聲當掉,而不是悄悄毀掉真正的資料。
int x = 5; printf("%p\n", (void*)&x); 可能印出 0x7ffd1c2a4b6c——這個號碼是 x 的位址,也就是它那 4 個位元組開始的盒子位置,而不是值 5。
&x 是盒子號碼;值 5 住在那個盒子裡面。
C 程式看到的位址是作業系統選定的虛擬位址,不是晶片上的實體位置;虛擬如何對映到實體(分頁)留到後面的 l 領域再談。這裡要把握的只是:位址是一個替某個位元組命名的號碼。
又称
另见