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...