記憶體與指標

取址運算子(&)

取址運算子寫成單一個和號 &,回答的是「這東西住在哪裡?」。你把它放在變數前面,它就交給你那個變數的位址——盒子號碼,而不是盒子裡的內容。所以若 x 坐落在 0x1000,那麼 &x 就是值 0x1000。

&x 產生一個型別相符的指標:若 x 是 int,&x 的型別就是 int *,可直接存進 int *p。它只能用在真正擁有位址的東西上——具名變數、陣列元素、結構欄位——而不能用在暫時值或字面常數上:&5 和 &(a + b) 都是錯誤,因為 5 和 a + b 從不住在某個明確的盒子裡。最常見的兩種用法是:取得區域變數的位址,好讓函式能寫回去(經典的輸出參數,就像 scanf("%d", &n) 那樣),以及記住某物所在之處,以便儲存或傳遞那個位置。

把 & 和 * 想成一對相反操作:& 把一個值的名字變成它的位址,而 * 把位址變回那個值,所以 *&x 又只是 x 而已。& 也正是為什麼 C 能假裝「傳參考」——即使它永遠只傳值——你傳的是 &x(位址的一份拷貝),而被呼叫者用 *p 透過它寫入。

void set(int *p) { *p = 42; } int n = 0; set(&n); ——呼叫後 n 是 42。我們傳了 &n,也就是 n 的位址;在 set 內部,*p = 42 跨過呼叫伸回去把 n 寫了。

&n 把位址交過去;*p 透過它寫入——這就是 C 的「傳參考」把戲。

同一個符號 & 放在兩個值之間(a & b)時也代表位元 AND,而 && 是邏輯 AND——三個不同的運算子共用這個字元。當作取址運算子時它是一元的,放在單一運算元前面。

又称
reference operatorampersand取址運算子