在C語言中,變量聲明的語法靈活多變,同一個標識符a配合不同的修飾符可以表示完全不同的類型。掌握這些聲明模式對於閱讀庫代碼、系統編程和嵌入式開發至關重要。本文系統梳理從基本類型到複雜函數指針的八種經典聲明形式。
// a) 一個整型數
int a;
// b) 一個指向整型數的指針
int *a;
// c) 一個指向指針的指針(雙重指針)
int **a;
這三種是最基礎的形式:int a直接存儲整數;int *a存儲整數的地址;int **a存儲指向int*的地址,常用於動態二維數組或修改指針值的函數參數。
// d) 一個含10個整型元素的數組
int a[10];
// e) 一個含10個整型指針的數組
int *a[10]; // 等價於 int *(a[10])
// f) 一個指向含10個整型數組的指針
int (*a)[10];
注意int *a[10]與int (*a)[10]的區別:前者是「指針數組」,後者是「數組指針」。運算符優先級使[]結合力強於*,因此需要括號改變結合順序。數組指針在處理二維數組、矩陣運算時極為常見。
// g) 指向函數的指針:參數為int,返回int
int (*a)(int);
// h) 含10個函數指針的數組:每個指向參數int、返回int的函數
int (*a[10])(int);
函數指針聲明的核心規則是:*a被括號包裹表示「a是指針」,後面的(int)表示指向的函數簽名。第h項結合了數組與函數指針,實際上是「函數指針數組」,可用於實現狀態機、回調表等模式。
面對複雜聲明時,可遵循「右左法則」:
例如int (*a[10])(int):a → 是數組[10] → 元素是指針* → 指向函數(int) → 返回int。
typedef分層簡化,如typedef int (*FuncPtr)(int); FuncPtr a[10];volatile int * const等組合std::function、auto、lambda表達式替代裸函數指針熟練掌握這八種聲明模式,能顯著提升代碼閱讀效率,避免「聲明恐懼症」。建議在紙上手寫幾遍,形成肌肉記憶。