指標 複雜的宣告

2021-07-04 13:57:10 字數 1263 閱讀 8002

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

閱讀步驟:

1.   從變數名開始   ----------------------------  fp1  

2.   往右看,是「)」,因此往左看,是「*」   -------   乙個指標  

3.   跳出括號,碰到了(int)   ------------  乙個帶乙個int引數的函式  

4.   向左看,發現乙個*   ---------------------(函式)返回乙個指標  

5.   跳出括號,向右看,碰到[10]   -------------   乙個10元素的陣列  

6.   向左看,發現乙個*   -----------------------   指標  

7.   向左看,發現int   -----------------------   int型別

p是乙個指標,指向乙個函式,函式引數為int型,函式返回乙個指標,指向乙個陣列(10個元素),陣列裡面儲存int*。

union sign *(*var[5])[5];

var宣告了乙個指標陣列,指標指向乙個union sign指標的陣列(5個元素)。

const char * const * const p8;

p8是乙個const指標,指向乙個const指標pa,pa指標指向const char型別。

char (* (*x[3]) () ) [5]

x是乙個陣列,包含3個函式指標,函式指標返回乙個指向char[5]的指標。

char *(* c[10])(int **)

c是乙個函式指標陣列,引數為int**(指向int指標的指標),返回值為char*。

unsigned int *(* const *name[5][10] ) ( void );

name是乙個2維陣列(5×10),儲存的是指向const型函式指標的指標,函式指標返回值為uint指標。

關於如何解析複雜的宣告,可以參考前面提到的相關文件。其中c專家程式設計裡面提到了乙個人機皆可使用的規則。

a 宣告從名字開始讀取,然後按照優先順序依次讀取。

b 優先順序從高到低依次為:

b1 被括號括起來的部分

b2 宣告字尾符, 括號表示是乙個函式,方括號【】表示是乙個陣列。

b3 字首操作,*表示「指向…的指標」

c 如果const和(或)volatile關鍵字後面緊跟型別說明符(如int long double),那麼它作用於型別說明符。在其他情況下const volatile關鍵字作用於它左邊緊鄰的指標星號。

複雜指標宣告

這是乙個簡單的法則,但能讓你準確理解所有的宣告。這個法則運用如下 從最內部的額括號開始閱讀宣告,向右看,然後向左看。當你碰到乙個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的範圍。這樣繼續,直到整個宣告都被宣告完畢。對上述右左法則做乙個小小的修正 當你在第一次開始閱讀宣告時,必須從變...

指標 複雜的宣告

int fp1 int 10 1.從變數名開始 fp1 2.往右看,是 因此往左看,是 乙個指標 3.跳出括號,碰到了 int 乙個帶乙個int引數的函式 4.向左看,發現乙個 函式 返回乙個指標 5.跳出括號,向右看,碰到 10 乙個10元素的陣列 6.向左看,發現乙個 指標 7.向左看,發現in...

指標(挑戰複雜的宣告)

ansi c 的標準庫中,有乙個atexit 的函式。如果使用這個函式,當程式正常結束的時候,可以調回乙個指定的乙個函式。原型定義如下 int atexit void func void 怎麼看呢?1.著眼於識別符號。intatexit void func void 2.解釋用於函式的 int at...