深入解析C語言聲明

如果說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 右到左

* / % 左到右

+ - 左到右

<< >> 左到右

< <= > >= 左到右

== != 左到右

& 左到右

^ 左到右

| 左到右

&& 左到右

|| 左到右

?: 右到左

= += -= *=  /= %= ^= |= <<= >>=  右到左

, 左到右

發佈了41 篇原創文章 · 獲贊 19 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章