如何讀懂複雜的c宣告
k&r曾經承認:「c語言宣告的語法有時會帶來嚴重的問題」。的確,諸如 char * const * ( * next ) ( ) ; char * ( * c[10]) ( int ** p );之類的宣告晦澀難懂,讓人迷茫。還好,peter van der linden在它的經典著作《expert c programming》中介紹了兩種解開這個難題的方法。
下面介紹讀懂c語言宣告兩法:
一、優先順序法。
a 宣告從它的名字開始讀取,然後按照優先順序順序依次讀取。
b 優先順序從高到低依次是:
b. 1 宣告中被括號括起來的部分
b. 2 字尾操作符:
括號 () 表示這是乙個函式
方括號 表示這是乙個陣列
b. 3 字首操作符:星號 * 表示 「指向...的指標」
c 如果const和(或)volatile關鍵字的後面緊跟型別說明符(如int,long等),那麼它作用於型別說明符。在其他情況下,const和(或)volatile關鍵字作用於它左邊緊鄰的指標星號。
舉例說明此法: char * const * (*next)();
a 首先,看變數名next,並注意到它直接被括號所括住
b.1 所以先把括號裡的東西看為乙個整體,得出「next是乙個指向...的指標」
b 然後考慮括號外的東西,在星號字首和括號字尾之間做出選擇
b.2 b.2規則告訴我們優先順序較高的是右邊的函式括號,所以得出「next是乙個函式指標,指向乙個返回...的函式」
b.3 然後,處理字首*,得出指標所指的內容
c 最後,把 char * const 解釋為指向字元的常量指標
概括分析之後,這個宣告表示:「next是乙個指標,它指向乙個函式,該函式返回另乙個指標,該指標指向乙個型別為char的常量指標」。
二、符號法。
步驟如下:
1、取最左邊的識別符號。
2、檢視識別符號右邊的下乙個符號,如果是方括號 [ ,則對於每一對,表示「...的陣列」
3、如果是左括號(,則到右括號為止的內容表示「返回...的函式」
4、如果左邊的符號是乙個左括號(,這個括號把已經處理的部分宣告組合在一起,直到遇見對應的右括號。然後從第2步重新開始。
5、如果左邊的符號是下述之一:
const volatile *
繼續向左讀取符號,知道所讀符號不再是上邊那三個之一。如果符號是const,表示「唯讀」,如果是volatile表示「volatile」,如果是*,表示「指向...的指標」然後重複第4步。
6、剩下的符號形成宣告的基本型別,剩餘的符號一併閱讀,如 static unsigned int
舉例說明此法:char * (* c[10] ) (int **p);
剩餘的宣告 所採取的下一步驟 結果
char * (* c[10])(int **p) 第1步 表示「c是...」
char * (* [10])(int **p) 第2步 匹配,表示「c是...的陣列」轉下一步
char * (* )(int **p) 第3、4步 不匹配,轉到下一步
char * (* )(int **p) 第5步 與星號匹配,表示「指向...的指標」,轉第4步
char * ( )(int **p) 第4步 與「(」匹配,轉到第2步
char * (int **p) 第2步 不匹配,轉下一步
char * (int **p) 第3步 匹配,表示「返回...的函式,這個函式以int **p為引數」
char * 第4步 不匹配,下一步
char * 第5步 匹配,表示「指向...的指標」,剩下char,執行第6步
char 第6步 直接閱讀
拼在一起,讀作:「c是乙個陣列,它的元素是指向函式的指標,該函式以int **p為引數,返回指向char的指標」。大功告成了!
事實上,以上的解析過程完全可以寫成乙個程式,用來解析c宣告,比如unix中的cdecl。
如何讀懂 C 語言複雜的宣告
如何讀懂 c 語言複雜的宣告 參考 雖說 c 語言相比於其他更高階的語言來講,有著非常精簡的語法結構,對於初學者非常的友好。然而,使用 c 語言依然可以可以寫出非常難懂的 也許這也就是精簡的語法所必須面對的缺點吧。筆者就經常一些複雜的宣告,看得一頭霧水,這裡就分享乙個幫你讀懂這些宣告的技巧吧。先自己...
如何分析複雜的C語言宣告
宣告從它的名字開始讀取,然後按照優先順序順序以此讀取 優先順序從高到低依次是 宣告中被括號擴起來的那部分 字尾操作符 字首引數操作符 如果const和volatile關鍵字的後面緊跟著型別說明符 如int,long 那麼 它作用於型別說明符.其他情況下,從const和volatile關鍵字作用於它左...
如何讀C 指標複雜宣告?
很多人都會被c 指標的複雜宣告搞混了。其實,讀c 指標宣告的過程,我們可以遵循2個原則 1 從名字開始,右 左 右 左 右這樣來讀 2 不斷對指標內容進行補完 對於指標,我們要知道指標的型別,知道了指標的型別也就是補完了 對於函式,我們要知道函式的引數和返回值,知道了也算是補完了 舉個例子 floa...