【C】 37_指針閱讀技巧分析

筆試中的問題

  • 下面的標識符表明什麼含義?
int (*p1)(int*, int (*f)(int*));

int (*p2[5])(int*);

int (*(*p3)[5])(int*);

int* (*(*p4)(int*))(int*);

int (*(*p5)(int*))[5];

指針閱讀技巧

  • 左右法則數組

    1. 從最裏層的圓括號中未定義的標識符看起
    2. 首先往右看,再往左看
    3. 遇到圓括號或方括號時,能夠肯定部分類型,並調轉方向
    • 重讀 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;

以上內容參考狄泰軟件學院系列課程,請你們保護原創!軟件

相關文章
相關標籤/搜索