- 下面的標識符表明什麼含義?
int (*p1)(int*, int (*f)(int*)); int (*p2[5])(int*); int (*(*p3)[5])(int*); int* (*(*p4)(int*))(int*); int (*(*p5)(int*))[5];
左右法則數組
- 從最裏層的圓括號中未定義的標識符看起
- 首先往右看,再往左看
- 遇到圓括號或方括號時,能夠肯定部分類型,並調轉方向
- 重讀 2,3 步驟,直到閱讀結束
int (*p)(int);
函數
1. (*p) ==> p 是一個指針 2. (*p)(int) ==> p 是一個函數指針 3. int (*p)(int) ==> p 是一個函數指針,函數類型爲 int(int)
int (*p1)(int*, int (*f)(int*))
指針
1. (*p1) ==> p1 是一個指針 2. (*p1)(int*, int (*f)(int*)) ==> p1 是一個函數指針 3. int (*p1)(int*, int (*f)(int*)) ==> p1 是一個函數指針,函數類型爲 int(int*, int (*f)(int*))
int (*p2[5])(int*)
code
1. p2[5] ==> p2是一個包含5個元素的數組 2. (*p2[5]) ==> p2是一個包含5個指針元素的指針數組 3. (*p2[5])(int*) ==> p2是一個包含5個函數指針元素的函數指針數組 4. int (*p2[5])(int*) ==> p2是一個包含5個函數指針元素的函數指針數組,函數類型爲 int(int*)
int (*(*p3)[5])(int*)
編譯器
1. (*p3) ==> p3 是一個指針 2. (*p3)[5] ==> p3 是一個數組指針,指向的數組包含5個元素 3. (*(*p3)[5]) ==> p3 是一個數組指針,指向的數組包含5個元素,元素類型爲指針 4. (*(*p3)[5])(int*) ==> p3 是一個數組指針,指向的數組包含5個元素,元素類型爲函數指針 5. int (*(*p3)[5])(int*) ==> p3 是一個數組指針,指向的數組包含5個元素,元素類型爲函數指針,函數類型爲 int(int*)
int* (*(*p4)(int*))(int*)
編譯
1. (*p4) ==> p4 是一個指針 2. (*p4)(int*) ==> p4 是一個函數指針 3. (*(*p4)(int*)) ==> p4 是一個函數指針,包含一個 int* 參數,函數返回值爲指針 4. (*(*p4)(int*))(int*) ==> p4 是一個函數指針,函數包含一個 int* 參數,函數返回值爲函數指針 5. int* (*(*p4)(int*))(int*) ==> p4 是一個函數指針,函數包含一個 int* 參數,函數返回值爲函數指針,函數類型爲 int(int*)
int (*(*p5)(int*))[5]
變量
1. (*p5) ==> p5 是一個指針 2. (*p5)(int*) ==> p5 是一個函數指針 3. (*(*p5)(int*)) ==> p5 是一個函數指針,函數包含一個 int* 參數,返回一個指針 5. (*(*p5)(int*))[5] ==> p5 是一個函數指針,函數包含一個 int* 參數,返回一個指向5個元素的數組指針 6. int (*(*p5)(int*))[5] ==> p5 是一個函數指針,函數包含一個 int* 參數,返回一個數組指針, 數組類型爲 int[5]
- 左右法則總結於編譯器對指針變量的解析過程
- 指針閱讀練習的意義在於理解指針的組合定義
- 能夠經過 typedef 簡化複雜指針的定義,以提升程序的可讀性
int* (*(*p4)(int*))(int*) ==> typedef int(Func1Type)(int*); typedef Func1Type*(Func2Type)(int*); Func2Type p4;
int (*(*p5)(int*))[5] ==> typedef int(ArrayType)[5]; typedef ArrayType* (FuncType)(int*); FuncType* p5;
以上內容參考狄泰軟件學院系列課程,請你們保護原創!軟件