從變數名看起,先往右,再往左,碰到乙個圓括號就調轉閱讀的方向;括號內分析完就跳出括號,還是按先右後左的順序,如此迴圈,直到整個宣告分析完。
int (*func)(int *p);
首先找到變數名func,外面有一對圓括號,而且左邊是乙個*號,這說明func是乙個指標;然後跳出這個圓括號,先看右邊,又遇到圓括號,這說明 (func)是乙個函式,所以func是乙個指向這類函式的指標,即函式指標,這類函式具有int型別的形參,返回值型別是int。
int (*func[5])(int *);
func 右邊是乙個運算子,說明func是具有5個元素的陣列;func的左邊有乙個*,說明func的元素是指標(注意這裡的不是修飾func,而是修飾 func[5]的,原因是運算子優先順序比高,func先跟結合)。跳出這個括號,看右邊,又遇到圓括號,說明func陣列的元素是函式型別的指 針,它指向的函式具有int*型別的形參,返回值型別為int。
a 宣告從t它的名字開始讀取,然後按照優先順序順序依次讀取。
b 優先順序從高到低依次是:
b.1 宣告中被括號括起來的那部分;
b.2 後續操作符:括號()表示這是乙個函式,方括號[ ]表示這是乙個陣列;
b.3 字首操作符:星號 *表示「指向···的指標」
c 如果const或者voliatile關鍵字後面緊跟著型別說明符(如int,long等),則它們作用於型別說明符;其他情況下,它們作用於左邊緊鄰的指標星號。
用優先順序規則分析c語言宣告一例:
char * const *(*next) ()
使用規則解釋a
首先,看變數名「next」,並且next直接被括號所包含
b.1所以把括號裡的東西作為乙個整體,得出「next是乙個指向···的指標」
b然後考慮括號外面的東西,在星號字首和括號字尾之間做出選擇
b.2b.2規則告訴我們優先順序較高的是右邊的函式括號,所以得出「next是乙個函式指標,指向乙個返回···的函式」
b.3然後,處理字首「*」,得出指標所指的內容
c最後把「char *const」解釋為指向字元的常量指標
綜上分析,這個宣告表示:「next是乙個指標,它指向乙個函式,該函式返回另外乙個指標,該指標指向乙個型別為char的常量指標」。
理解C語言宣告的優先順序規則
a 宣告從它的名字開始讀取,然後按照優先順序順序依次讀取 b 優先順序從高到低依次是 b.1 宣告中被括號括起來的那部分 b.2 字尾操作符 括號 表示這是乙個函式,而 表示這是乙個陣列 b.3 字首操作符 星號 表示 指向.的指標 c 如果const和 或 volatile關鍵字的後面緊跟型別說明...
C 語言複雜宣告的理解
c語言常常因為宣告的語法問題而受到人們的批評,特別是涉及到函式指標的語法。c語言的語法力圖使宣告和使用相一致。對於簡單的情況,c語言的做法是很有效的,但是,如果情況比較複雜,則容易讓人混淆,原因在於,c語言的宣告不能從左至右閱讀,而且使用了太多的圓括號.但是找到正確的規則去理解,無論多複雜都可以搞清...
C語言宣告優先順序規則
a 宣告從它的名字開始讀取,然後按照優先順序順序依次讀取。b 優先順序從高到低依次是 b.1 宣告中被括號括起來的部分 b.2 字尾操作符 括號 表示這是乙個 函式,而方括號表示這是乙個陣列 b.3 字首操作符 號表示 指向.的指標 c 如果const和 或 volatile關鍵字的後面緊跟型別說明...