C語言複雜宣告

2022-03-07 08:27:25 字數 1035 閱讀 5330

乙個宣告: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 關鍵字的後面緊跟...