int a = 10; int *p = &a; // p 儲存 a 的位址 // 記憶體兩塊:p 自身位址 (&p)、a 的位址 (&a == p)
() → 函數,[] → 陣列。* → 指向,const → 常量,型別 → 基礎型別。int *(*fp)(int, char*); // fp 是 → 指標 → 指向函數 (int, char*) → 回傳 int*
| 表達式 | 型別 | 值 | +1 後指向 |
|---|---|---|---|
a | int* | 首元素位址 | 第二元素 |
&a[0] | int* | 首元素位址 | 第二元素 |
&a | int(*)[3] | 整個陣列位址 | 下一個陣列 (跨越整個陣列大小) |
關鍵:a+1 == &a[0]+1,&a+1 跨越整個陣列。
| 術語 | 主語 | 宣告範例 |
|---|---|---|
| 指標陣列 | 陣列 | int *arr[10]; |
| 陣列指標 | 指標 | int (*arr)[10]; |
| 函數指標 | 指標 | int (*fp)(int); |
| 指標函數 | 函數 | int *fp(int); |
| 指標常量 | 常量 (指標本身不可改) | int * const p; |
| 常量指標 | 指標 (指向常量) | const int *p; |
int *p = NULL; 或 = &var;。free(p); p = NULL; 形成肌肉記憶。掌握「由右向左讀」萬能解讀法、「前修飾後主語」中文口訣、陣列三重身分區別、野指標雙重防禦,即可破解任意複雜指標宣告,編寫型別安全、意圖清晰的 C 程式碼。