C語言複雜宣告

2021-08-16 03:35:22 字數 2998 閱讀 9159

問題1:宣告與函式

(*(void (*)( ) )0)( )。讓我們從兩個不同的途徑來詳細分析這個問題。

分析:

首先,最基本的函式宣告: void function (paramlist);

最基本的函式呼叫: function(paramlist);

鑑於問題中的函式沒有引數,函式呼叫可簡化為 function();

其次,根據問題描述,可以知道 0是這個函式的入口位址,也就是說,0是乙個函式的指標。使用函式指標的函式宣告形式是:void (*pfunction)(),相應的呼叫形式是: (*pfunction)(),則問題中的函式呼叫可以寫作:(*0)( )。

第三,大家知道,函式指標變數不能是乙個常數,因此上式中的 0必須要被轉化為函式指標。

我們先來研究一下,對於使用函式指標的函式:比如 void (*pfunction)( ),函式指標變數的原型是什麼?這個問題很簡單,pfunction函式指標原型是( void (*)( ) ),即去掉變數名,清晰起見,整個加上()號。

所以將 0強制轉換為乙個返回值為void,引數為空的函式指標如下:( void (*)( ) )。

ok,結合2)和3)的分析,結果出來了,那就是:(*(void (*)( ) )0)( ) 。

解釋:

(void (*)( )) ,是乙個返回值為void,引數為空的函式指標原型。

(void (*)( ))0,把0轉變成乙個返回值為void,引數為空的函式指標,指標指向的位址為0.

*(void (*)( ))0,前面加上*表示整個是乙個返回值為void的函式的名字

(*(void (*)( ))0)( ),這當然就是乙個函式了。

我們可以使用 typedef清晰宣告如下:

typedef void (*pfun)( );

這樣定義之後,pfun就是乙個返回型別為void無引數的函式指標變數了。

這樣函式變為 (*(pfun)0 )( );

問題2:三個宣告的分析

對宣告進行分析,最根本的方法還是模擬替換法,從那些最基本的宣告上進行模擬,簡化,從而進行理解,下面通過分析三個例子,來具體闡述如何使用這種方法。

# 1:int* (a[5])(int, char);

首先看到識別符號名 a,」」優先順序大於」「,a與」[5]」先結合。所以a是乙個陣列,這個陣列有5個元素,每乙個元素都是乙個指標,指標指向」(int, char)」,很明顯,指向的是乙個函式,這個函式引數是」int, char*」,返回值是」int*」。ok,結束了乙個。:)

# 2:void (*b[10]) (void (*)());

b是乙個陣列,這個陣列有10個元素,每乙個元素都是乙個指標,指標指向乙個函式,函式引數是」void (*)()」【注10】,返回值是」void」。完畢!

注意:這個引數又是乙個指標,指向乙個函式,函式引數為空,返回值是 「void」。

# 3. doube(*)() (*pa)[9];

pa是乙個指標,指標指向乙個陣列,這個陣列有9個元素,每乙個元素都是」doube(*)()」(也即乙個函式指標,指向乙個函式,這個函式的引數為空,返回值是」double」)。

c語言中的函式指標

函 數在記憶體中有乙個物理位置,而這個位置是可以賦給乙個指標的。一零點函式的位址就是該函式的入口點。因此,函式指標可被用來呼叫乙個函式。函式的位址是用 不帶任何括號或引數的函式名來得到的。(這很類似於陣列位址的得到方法,即,在只有陣列名而無下標是就得到陣列位址。)

怎樣說明乙個函式指標變數呢 ?

為了說明乙個變數 fn_pointer 的型別是」返回值為 int 的函式指標」, 你可以使用下面的說明語句:

int (*fn_pointer) ();

為了讓編譯器能正確地解釋這句語句, *fn_pointer 必須用括號圍起來。若漏了這對括號, 則:

int *fn_pointer ();

的意思完全不同了。fn_pointer 將是乙個函式名, 其返回值為 int 型別的指標。

函式指標變數

在c語言中規定,乙個函式總是占用一段連續的記憶體區, 而函式名就是該函式所佔記憶體區的首位址。 我們可以把函式的這個首位址 ( 或稱入口位址 ) 賦予乙個指標變數, 使該指標變數指向該函式。然後通過指標變數就可以找到並呼叫這個函式。 我們把這種指向函式的指標變數稱為 」 函式指標變數 」 。

函式指標變數定義的一般形式為:

型別說明符 (* 指標變數名 )();

其中 」 型別說明符 」 表示被指函式的返回值的型別。 「(* 指標變數名 )」 表示 「*」 後面的變數是定義的指標變數。 最後的空括號表示指標變數所指的是乙個函式。

例如: int (*pf)();

表示 pf 是乙個指向函式入口的指標變數,該函式的返回值 ( 函式值 ) 是整型。

下面通過例子來說明用指標形式實現對函式呼叫的方法。

int max(int a,int b)

main()

從上述程式可以看出用,函式指標變數形式呼叫函式的步驟如下:

先定義函式指標變數,如後一程式中第 9 行 int (*pmax)(); 定義 pmax 為函式指標變數。

把被調函式的入口位址 ( 函式名 ) 賦予該函式指標變數,如程式中第 11 行 pmax=max;

用函式指標變數形式呼叫函式,如程式第 14 行 z=(*pmax)(x,y);  呼叫函式的一般形式為: (* 指標變數名 ) ( 實參表 ) 使用函式指標變數還應注意以下兩點:

a. 函式指標變數不能進行算術運算,這是與陣列指標變數不同的。陣列指標變數加減乙個整數可使指標移動指向後面或前面的陣列元素,而函式指標的移動是毫無意義的。

b. 函式呼叫中 「(* 指標變數名 )」 的兩邊的括號不可少,其中的*不應該理解為求值運算,在此處它只是一種表示符號。

C語言複雜宣告

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

複雜宣告 C語言

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

C語言複雜宣告

乙個宣告 int p 分為四部分 1 p 2 p右面的符號 可以什麼都沒有 3 p左面的符號 可以什麼都沒有 4 最左面的型別說明符 解讀乙個宣告先從p開始,然後的順序是 右左右左右左右左 看完了p,然後從p的右邊開始看符號 因為優先順序高的符號 和 是放在右邊的 如果有符號,就和p先結合。看完右邊...