乙個宣告:int *p
分為四部分:
(1)p
(2)p右面的符號(可以什麼都沒有)
(3)p左面的符號(可以什麼都沒有)
(4)最左面的型別說明符
解讀乙個宣告先從p開始,然後的順序是:右左右左右左右左····
看完了p,然後從p的右邊開始看符號(因為優先順序高的符號 [ ]和 ( ) 是放在右邊的),如果有符號,就和p先結合。
看完右邊的符號(如果有的話)後,就決定了p是什麼,比如p右面是,那麼p就是陣列,如果是(),那麼p就是函式,如果什麼都沒有,那麼p就是變數。
這時,就到p左邊的符號發揮作用了(左邊要麼是 * ,要麼就什麼都沒有)。
最後發揮作用是則是型別說明符(int,char,long······)。
實戰演示:
int (*p)();
先看p右面,由於有乙個括號把p和*括起來,所以這個宣告的最內層是(*p),所以p右面沒有東西,那麼p就是個變數。
左面,(*p)左面是*,所以p是乙個指標變數。
右面,(*p)的右面是乙個(),所以p這個指標,指向的是函式。
左面,什麼都沒有了。
最後是型別符,int,所以,p是乙個指標變數,指向函式,函式返回值是int型別。
char (*(*x()))();
先看x右面,(),x是乙個函式
左面,*,函式返回值型別是指標
右面,,函式的返回值是指標,該指標指向陣列
左面,*,陣列內存放的資料是指標
右面,(),陣列內的指標指向的是函式(函式指標)
左面,指標指向的函式的返回值是char
char (*(*x[3])())[5];
x右面,[3],x是乙個陣列,陣列內有三個元素
左面,*,陣列內的元素是指標
右面,(),指標指向的函式
左面,*,函式的返回值型別是指標
右面,[5],指標指向的是陣列,指向的陣列容量是5
左面,char 陣列內的元素是char型別
最後說一句,真不知道這樣的宣告定義出來的東西誰能看懂,我反正是不會用的。
C語言複雜宣告
專家程式設計 第三章介紹了如何分析複雜的宣告,講的非常不錯。對於作者介紹的分析複雜宣告的方法,我沒有完全掌握,不過,我有我自己的一套方法來解析複雜的宣告,正所謂條條大道通羅馬,只要結果一樣,必須在乎過程呢。今天在網上找了幾個複雜的宣告,練練手 宣告的例子全部來自網路,原諒出處未詳 記下此文,作個標記...
C語言複雜宣告
問題1 宣告與函式 void 0 讓我們從兩個不同的途徑來詳細分析這個問題。分析 首先,最基本的函式宣告 void function paramlist 最基本的函式呼叫 function paramlist 鑑於問題中的函式沒有引數,函式呼叫可簡化為 function 其次,根據問題描述,可以知道...
複雜宣告 C語言
今天看了 c專家程式設計 裡的 分析c語言的宣告 一章,終於懂了c語言的複雜宣告是怎麼解析的。雖然在平時寫 的時候用到複雜宣告的情況幾乎沒有,這裡還是做乙個記錄,也是加深對c語言宣告的理解。以下規則來自 c專家程式設計 c語言宣告的優先順序規則 c.如果const或volatile 關鍵字的後面緊跟...