c語言有它獨特而複雜的宣告規則,在c語言中乙個宣告是由識別符號和關鍵字組成的乙個表示式,注意,這裡說的是關鍵字和識別符號一起組成的乙個表示式,關鍵字與識別符號的順序可以以符合語法的方式隨意組合。因為大多數簡單的宣告都是由左邊型別右邊識別符號(變數名)組成,所以給我們造成一種宣告語法必須先說明型別再說明變數名的錯覺。實際上c語言的宣告方式有他自己的一套規則,並不是說簡單的從左向右解析,編譯器解析宣告語句的時候也是按照這一套規則和步驟進行的。
以上步驟處理的是乙個單純的變數宣告,如果要用typedef宣告乙個型別,那麼上訴步驟中本來是變數名的就會被當成型別名。
總結和例子:注意:上面的步驟處理的不僅僅是指標型別,無論是一般的變數宣告還是函式或者是複雜的指標宣告都是用上述的步驟去解析的。
其實這裡像是剝洋蔥,也有一點遞迴得思想在裡面,就是一步一步的通過優先順序來獲取所想知道的型別(這裡的優先順序是指:優先順序括號---->右邊([ ]或())---->左邊(int,float,*等等)),每次解析乙個宣告表示式的時候都可以一邊解析一邊問自己想要知道的型別是什麼,然後通過步驟2來獲得答案。
例子如下(上述看懂了的可以不用看,可以自己試試)
void(*
(*var[10]
)(int))(
);
typedef
void(*
(*var[10]
)(int))(
);
注意它們的區別!!!
第一條語句是乙個合法的宣告語句,它宣告且定義了乙個變數,這個變數的名字就是var,這個變數的型別就是通過上述步驟得到的型別。
第二條語句是乙個typedef的型別宣告,它只宣告了相應的型別,並沒有宣告和定義變數,就如同把一般的變數宣告語句中的變數名看做型別名。
這裡先講解一下第乙個語句,也就是變數名的常規宣告。
我們首先找到變數名,這裡是var,問自己:它的型別是什麼呢?先向右看(步驟2),因為右邊有[ ],所以答:他是陣列型別;然後接著問自己:陣列的元素的型別是什麼呢,因為有括號要先解析括號裡的(步驟0),所以向左看(步驟2),看到星號,答:陣列的元素型別是指標型別;接著問:那麼這個指標型別指向的是什麼型別呢?優先向右看(步驟2),因為右邊出現( )函式符號,所以答:這個指標指向的型別是乙個函式,很明顯接受乙個int引數;又問:這個函式的返回型別是什麼呢?因為出現了括號(步驟0),要先解析括號裡的,所以向左看看到星號,答:返回型別是乙個指標;又問:這個指標指向什麼型別呢?向右看(步驟2),右邊出現了( )符號所以這個指標指向乙個函式;問:這個函式的返回值是什麼呢?向右看(步驟2),沒有[ ]或(),所以只能向左看進而看到void標識,所以答:無返回值;
所以最後的答案是:它是乙個陣列元素為指標的陣列,指標指向乙個函式,這個函式接受乙個int作為引數並且返回乙個指標,這個指標又指向乙個函式,這個函式無引數無返回值。
複雜宣告解析
c語言的指標很久沒看了,複習一下,做一下總結。c語言的複雜宣告,例如 void f int,int int 怎麼樣,是不是很複雜?看著摸不到頭腦,不知從何說起。看了挺多資料,主要是應用 右左法則 現總結如下 1.基本的c語言宣告 int a 宣告乙個整形數a int a 宣告乙個指標,該指標指向乙個...
複雜宣告展開
分解 1 fp 和 號括在一起,說明 fp 是乙個指標,指向 t1 型別 typedef int t1 void 10 用其他型別定義型別t1 t1 fp fp是指向t1型別的指標2 t1 應該是乙個函式型別,引數是 void 返回值是 t2 型別 typedef int t2 10 用其他型別定義...
C語言複雜宣告
專家程式設計 第三章介紹了如何分析複雜的宣告,講的非常不錯。對於作者介紹的分析複雜宣告的方法,我沒有完全掌握,不過,我有我自己的一套方法來解析複雜的宣告,正所謂條條大道通羅馬,只要結果一樣,必須在乎過程呢。今天在網上找了幾個複雜的宣告,練練手 宣告的例子全部來自網路,原諒出處未詳 記下此文,作個標記...