程式碼對照
void f(int *u); // 宣告:參數為 int 指標
int main() {
int x = 10;
f(&x); // 呼叫:傳遞 x 的位址 (&x)
}
void f(int *u) {
// 此處 u 接收 &x 的值,即 x 的位址
*u = 20; // 透過指標修改 x 的值
}
記憶體圖解
main 棧框: f 棧框:
+--------+ +--------+
| x: 10 | 0x7ff... | u: 0x7ff... | ← u 存放 &x (0x7ff...)
+--------+ +--------+
│ │
└──────────────────┘ 指向同一記憶體位置
關鍵釐清
int *u 宣告 **u 是指標**,型別為 `int*`。
&x 取得 **x 的位址**,型別 `int*`,**型別匹配**,賦值給 `u`。
- **被賦值的是 `u`** (指標變數本身),**不是 `*u`** (指標指向的內容)。
- 函數內 `
*u = 20` 才是修改 **指向的內容** (即 `x`)。
常見誤區
| 誤解 | 正確 |
| 以為 `*u` 是參數 | 參數是 `u` (指標),`*u` 是解參考運算 |
| 以為傳遞的是 `x` 的值 | 傳遞的是 `x` 的**位址** (`&x`),故稱「傳址呼叫」 |
| 以為 `u` 是「位址的位址」 | `u` 就是位址 (指標值),不再是位址的位址 |
進階:const 正確性
// 僅需讀取,不修改
void printInt(const int *u) {
printf("%d\n", *u); // OK
// *u = 10; // 編譯錯誤:不能修改 const 指向的值
}