指針聲明遵循「從變量名開始,按優先級向外擴展」的原則:
() 最高,表示函數。[] 次之,表示數組。* 最低,表示指針。int (*func)(int *p, int (*f)(int *));func 是指針 *func(),參數:int *p 和 int (*f)(int *)intfunc 是函數指針,指向接受「int 指針」和「函數指針(參數 int*,返回 int)」的函數,該函數返回 int。int (*func[5])(int *p);func 先結合 [5] → 數組*func[0] 是指針(),參數 int *p,返回 intfunc 是含 5 個元素的數組,每個元素是函數指針,指向「參數 int*,返回 int」的函數。int (*(*func)[5])(int *p);func 先結合 * → 指針[5]*(),參數 int *p,返回 intfunc 是指針,指向「含 5 個函數指針的數組」,每個函數指針指向「參數 int*,返回 int」的函數。int (*(*func)(int *p))[5];func 先結合 * → 指針(),參數 int *p*[5],元素為 intfunc 是函數指針,指向「參數 int*,返回「指向 5 個 int 的數組的指針」」的函數。指針運算實為地址運算,僅允許:
p + 1 相當於 (char*)p + sizeof(*p))。ptrdiff_t)。==、!=、<、> 等,比較地址順序。禁止:指針 + 指針、指針 × 整數、指針位運算等。
int arr[10];
int *p = arr; // p 指向 int,步長 4 字節
char *q = (char*)arr; // q 指向 char,步長 1 字節
p + 1; // 地址 +4
q + 1; // 地址 +1
同一地址,不同類型指針運算結果截然不同——這正是 C 語言靈活與危險並存的根源。
下一篇將深入講解:指針常量 vs 常量指針、指針數組 vs 數組指針、函數指針 vs 指針函數、野指針成因與防範——敬請期待!