C 語言聲明採用「聲明模仿使用」原則,運算符優先級決定結合順序。掌握**從變量名出發、按優先級結合**的通用讀解法,任何複雜類型都能秒懂。
() [函數調用]、[] [數組下標] — **最高*** [指針解引用] — 次高基本類型 (int, char...) — 最低「從變量名起,先結合右邊的[]/(),再結合左邊的*,最後結合基本類型。」
| 聲明 | 讀解步驟 | 含義 |
|---|---|---|
int p; | p → int | 整型變量 |
int *p; | p → * → int | 指向 int 的指針 |
int p[3]; | p → [3] → int | 含 3 個 int 的數組 |
int *p[3]; | p → [3] → * → int | 含 3 個「指向 int 的指針」的數組 |
int (*p)[3]; | p → * → [3] → int | 指向「含 3 個 int 的數組」的指針 |
int **p; | p → * → * → int | 指向「指向 int 的指針」的指針 (二級指針) |
int p(int); | p → (int) → int | 參數為 int、返回 int 的函數 |
int (*p)(int); | p → * → (int) → int | 指向「參數 int、返回 int 的函數」的指針 |
int *(*p(int))[3]; | p → (int) → * → [3] → * → int | 參數 int、返回「指向「含 3 個 int* 的數組」的指針」的函數 |
[] 和 () 同級,**左結合**,比 * 高。() 可**強行改變結合順序** (如 (*p)[3] vs *p[3])。**, ***) 現實中極少超過二級,理解 ** 即夠用。int (*p)(int) ≠ int *p(int)。// 信號處理函數類型
void (*signal(int sig, void (*handler)(int)))(int);
// 讀解:signal → (int, void(*)(int)) → * → (int) → void
// 含義:參數為 (int, 函數指針),返回「指向 void(int) 函數的指針」的函數
typedef 分層:typedef void (*Handler)(int);
typedef Handler (*SignalFunc)(int, Handler);
SignalFunc signal;
cdecl / c++decl 工具** — 命令行輸入聲明即可得到英文解釋。複雜類型聲明不是天書,而是**優先級規則的直觀體現**。熟練掌握「從變量名出發,按優先級結合」的通用法,配合 typedef 封裝,即可輕鬆駕馭任何 C/C++ 類型聲明。