程式碼:
int a;
scanf("%d", &a);
問題:`&` 明明是要把輸入的值存進 `a`,為何叫「取地址」而不是「取值」?
若呼叫 `scanf("%d", a)`(傳值),`scanf` 會拿到 `a` 當時的垃圾值(如 0),視為位址 `0x0` 寫入,導致段錯誤或竄改關鍵資料。
C 語言採呼叫傳值,函式無法直接修改呼叫端的區域變數。必須傳遞變數的位址,函式透過指標解參考才能修改原變數。
| 概念 | 現實類比 |
|---|---|
| 變數 a | 你的家 |
| a 的值 (10) | 家裡放的 10 元 |
| &a (地址) | 家的門牌號碼 |
| scanf 需要 &a | 郵差要門牌號碼才能把錢塞進你家門縫 |
int *p = &a;
scanf("%d", p); // 正確,p 本身就是地址
scanf("%d", &*p); // 等價,&* 抵消
`&` 稱為「取地址」是因為它的運算結果是變數的記憶體位址。`scanf` 需要這個位址以便將解析後的資料寫入該位址,完成「輸入 → 變數」的資料流向。