C語言中變數的複雜宣告和定義

2021-07-02 07:21:40 字數 1035 閱讀 1501

我們知道:任何c語言變數的宣告都由兩部分組成:型別以及一組類似表示式的宣告符。一旦我們知道如何宣告乙個給定型別的變數,那麼該型別的型別轉換符就很容易得到:只需要把宣告中的變數名和末尾的分號去掉,再將剩餘的部分用乙個括號整個「封裝」起來即可。

例如:float (*h)();表示h是乙個指向返回值為浮點型別的函式的指標,所以(float (*)())乙個「指向返回值為浮點型別的函式的指標」的型別轉換符。

擁有了這些知識,下面我們將分析乙個更為複雜的表示式:(*(void(*)())0)();對此,我們分兩步分析此表示式。

第一步:假定fp是乙個函式指標,呼叫fp所指向的函式方法是:(*fp)();因為fp是函式指標,則*fp是該指標所指向的函式,所以(*fp)()就是呼叫該函式的方式。在表示式(*fp)()中,*fp兩側的括號非常重要,因為函式運算子()的優先順序高於單目運算子*。如果*fp兩側沒有括號,那麼*fp()實際上與*(fp())的含義完全一樣,ansi c把它作為*((*fp)())的簡寫形式。剩下的問題就是找到乙個恰當的表示式替換fp.

第二步:解決問題。我們知道如何宣告乙個變數,也就知道如何對乙個常數進行型別轉換,將其轉型為該變數的型別:只需在變數宣告中去掉變數名。因此,將常數0轉型為「指向返回值為void的函式的指標」型別,可以寫為(void(*)())0,因此可以用(void(*)())0來替換fp,從而得到(*(void(*)())0)();

下面再舉幾個例子,以便更深一步的了解。

1.void *(*(*fp1) (int)) [10]; fp1是乙個指向函式的指標,該函式接受乙個整形引數並返回乙個指向含有10個void指標陣列的指標。

2. float (*(*fp2)(int,int,float))(int); fp2是乙個指向函式的指標,該函式接收三個引數(int,int,float)且返回乙個指向函式的指標,該函式接受乙個整型引數並返回乙個float.

3.int (*(*fp4()) [10]) ();  這不是變數而是乙個函式,fp4是乙個返回指標的函式,該指標指向含有10個函式指標的陣列,這些函式返回整型值。

以上分享參考:c陷阱與缺陷 和c++程式設計思想第一卷

C語言複雜宣告

專家程式設計 第三章介紹了如何分析複雜的宣告,講的非常不錯。對於作者介紹的分析複雜宣告的方法,我沒有完全掌握,不過,我有我自己的一套方法來解析複雜的宣告,正所謂條條大道通羅馬,只要結果一樣,必須在乎過程呢。今天在網上找了幾個複雜的宣告,練練手 宣告的例子全部來自網路,原諒出處未詳 記下此文,作個標記...

C語言複雜宣告

問題1 宣告與函式 void 0 讓我們從兩個不同的途徑來詳細分析這個問題。分析 首先,最基本的函式宣告 void function paramlist 最基本的函式呼叫 function paramlist 鑑於問題中的函式沒有引數,函式呼叫可簡化為 function 其次,根據問題描述,可以知道...

複雜宣告 C語言

今天看了 c專家程式設計 裡的 分析c語言的宣告 一章,終於懂了c語言的複雜宣告是怎麼解析的。雖然在平時寫 的時候用到複雜宣告的情況幾乎沒有,這裡還是做乙個記錄,也是加深對c語言宣告的理解。以下規則來自 c專家程式設計 c語言宣告的優先順序規則 c.如果const或volatile 關鍵字的後面緊跟...