複雜指針聲明

右左法則

這是一個簡單的法則,但能讓你準確理解所有的聲明。這個法則運用如下:從最內部的額括號開始閱讀聲明,向右看,然後向左看。當你碰到一個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的範圍。這樣繼續,直到整個聲明都被聲明完畢。
對上述右左法則做一個小小的修正:當你在第一次開始閱讀聲明時,必須從變量名開始,而不是從最內部的括號。下面結合例子來演示一下右左法則的使用。

int *(*(*fp1) (int) ) [10];

閱讀步驟:

  • 從變量名開始——fp1。
  • 往右看,什麼也沒有,碰到了),因此往左看,碰到一個*——一個指針。
  • 跳出括號,碰到了(int)——一個帶一個int參數的函數。
  • 往左看,發現一個*——(函數)返回一個指針。
  • 跳出括號,往右看,碰到[10]——一個10元素的數組。
  • 往左看,發現一個*——指針。
  • 往左看,發現int——int類型。
    總結:fp1是一個函數指針變量,指向一個形參int,返回值爲一個數組指針的函數,該指針指向一個整型指針數組。

再看幾個例子:
1.

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

arr爲函數指針數組,該數組的元素指向形參爲空,返回值爲函數指針的函數。該指針指向一個形參爲空,返回值爲int *的函數。
2.

float (*(*b())[])();

b爲函數,該函數形參爲空,返回值數組指針,該指針指向一個函數指針數組,數組的元素指向一個形參爲空,返回值爲float的函數。
3.

void *(*c)(char a, int (*b)());

c爲函數指針變量,指向一個有兩個參數,返回值爲void*的函數,第一個形參爲char,第二個形參爲函數指針,該指針指向一個形參爲空,返回值爲int的函數。
4.

float (*(* e[10])(int *))[5];

e爲函數指針數組,數組元素指向一個形參爲int *,返回值爲數組指針,指向的數組爲float型數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章