如果說C語言聲明很簡單的人不是牛人就是還沒入門。本文來講解C語言的聲明的一些基本內容,很多內容參考《c專家編程》。首先由一個最簡單的問題引入,你知道 int * p[5] 和 int (*p)[5] 的區別在哪裏嗎?把後面的答案遮到,想想。也許你知道反正一個是含有五個指向整型的指針元素的指針數組,另一個是指向一個擁有5個整型元素的數組的指針,具體呢?
int *p[5]是一個含有五個整型指針的數組,int(*p)[5]是一個指向5個整型元素的數組指針。如果你能分清楚,恭喜你,你起碼是入門級以上的水平。那這個呢, char * const *(*next)()?
如果你能把上面這句聲明清清楚楚明明白白的說出來,下面你不用看了,下面的東西對你來說都是廢話。
首先我們需要理解C語言的聲明的優先級規則,如下:
A 聲明從它的名字開始讀取,然後按照優先級順序來依次讀取。
B 優先級從高到底依次是:
B.1 生命中被括號括起來的那部分
B.2 後綴操作符
括號()表示這是一個函數,而方括號[]表示這是一個數組
B.3 前綴操作符: 星號*表示 指向...的指針
C 如果const在指針星號前他作用於指針指向的變量,如果const在指針星號後他作用於指針
另一種說法是,const修飾的是它前面的類型,如果它前面沒有類型則修飾的是緊跟其後的類型
如 const int * a; int const * a; int * const a;前兩個const在*之前,指針所指向的變量是隻讀,最後一個是指針本身只讀。
我們開始解析上面的聲明
適用規則 解釋
A 首先,看變量名"next",並注意到它直接被括號所括住
B.1 所以先把括號裏面的東西作爲一個整體,得出"next是一個指向...的指針"
B 然後考慮括號外面的東西,在星號前綴和括號後綴之間做出選擇
B.2 規則告訴我們優先級較高的是右邊的函數括號,所以得出"next是一個函數指針,指向一個返回...的函數"
B.3 然後,處理前綴"*",得出指針所指的內容
C 最後,把"char * const"解釋爲指向字符的常量指針
所以綜上所述,這個式子的真正的含義是:next是一個指針,它指向一個函數,該函數返回另一個指針,該指針指向一個類型爲char的常量指針。
其實理解這個最基本的優先級是需要理解的運算符的優先級:如下順序
操作符 結合性
() [] -> . 左到右
! - ++ -- + - * & sizeof 右到左
* / % 左到右
+ - 左到右
<< >> 左到右
< <= > >= 左到右
== != 左到右
& 左到右
^ 左到右
| 左到右
&& 左到右
|| 左到右
?: 右到左
= += -= *= /= %= ^= |= <<= >>= 右到左
, 左到右