面對 char* const *(*next)() 這類聲明,掌握**通用讀法**即可游刃有餘。
char* const *(*next)();
│ │ │ │ │
│ │ │ │ └─ 5. 無參數
│ │ │ └──── 4. 指向函數
│ │ └─────── 3. 是一個指針
│ └────────── 2. const 修飾指針 (指針不可變)
└─────────────── 1. 指向 char* 類型
讀法口訣:next 是一個指針,指向一個無參函數,該函數返回一個指針,該指針指向 char 類型,且該返回指針是常量 (不可修改指向)。
int *ap[]:ap 是數組 → 元素是指針 → 指向 int。const int *p:p 是指針 → 指向 const int (值不可變)。int *const p:p 是常量指針 → 指向 int (指針不可變)。
int * (* (*fp1)())[10]();
逐層拆解:fp1 是指針 → 指向函數 → 函數返回指針 → 指向數組(10元素) → 數組元素是指針 → 指向函數 → 函數返回 int。
實戰中極少見,了解讀法即可。
#define:typedef 參與類型系統,可與類型說明符組合 (如 unsigned tInt),連續聲明保證類型一致 (typedef int* pInt; pInt a, b; 皆為 int*),#define 純文本替換無此保障。
// 原始難讀聲明
void (*signal(int sig, void (*func)(int)))(int);
// 使用 typedef
typedef void (*SigHandler)(int);
SigHandler signal(int sig, SigHandler func);
清晰明了:signal 接收信號碼與處理函數指針,返回前一處理函數指針。
typedef struct MyStruct { ... } MyType;
// 等價於 struct MyStruct,少寫 struct 關鍵字
extern。指針/數組聲明即定義 (確定移動步長/長度),故跨文件聲明定義**必須匹配** (見下期)。