符號定義:資料型別 [*] 或 [*] 變數名 或 *。
依此規則由右向左讀取宣告,即可精確判斷什麼被鎖定為常量。
| 宣告 | 讀法(由右向左) | const 修飾對象 | 初始化要求 |
|---|---|---|---|
const char *p1 | p1 是指標 → 指向 char → char 是 const | *p1 (指向的值) | p1 本身可修改,*p1 不可修改 |
char const *p2 | 同上(const 前置/後置等價) | *p2 | 同 p1 |
char * const p3 | p3 是 const → 指標 → 指向 char | p3 (指標本身) | 宣告時必須初始化,之後不可指向他處 |
const char **p4 | p4 指標 → 指向指標 → 指向 const char | **p4 | p4、*p4 可修改,**p4 不可修改 |
char const **p5 | 同 p4 | **p5 | 同 p4 |
char * const *p6 | p6 指標 → 指向 const 指標 → 指向 char | *p6 (中間指標) | p6 可修改,*p6 必須初始化且不可修改 |
char ** const p7 | p7 是 const 指標 → 指向指標 → 指向 char | p7 | 宣告時必須初始化 |
賦值合法需滿足:
1. 兩側指向相容型別,且限定詞相同;
2. 或左側限定詞 包含 右側所有限定詞(左側更嚴格)。
const char **ppc;
char **pc;
ppc = pc; // ❌ 錯誤:char** 不能隱性轉為 const char**
// 因為透過 ppc 可修改 const char* 指向的內容
pc = ppc; // ❌ 錯誤:const char** 不能轉為 char**
int *arr[10]int (*arr)[10]int (*fp)(int)int *fp()int * const pconst int *p掌握「const 修飾右側第一符號」核心規則、賦值相容性原則與中文語法口訣,即可輕鬆破解任意複雜度的 const 宣告,編寫型別安全、意圖明確的 C 程式碼。