函式指標與函式宣告

2021-09-23 23:21:22 字數 1400 閱讀 1378

問題:當計算機啟動時,硬體將呼叫首位址為0的子例程,為了模擬開機啟動時的情形,如何設計出乙個c語句,以顯示呼叫該子例程。

換個問法:有一段程式儲存在起始位址為 0的一段記憶體上,如果我們想要呼叫這段程式,請問該如何去做? 

《c陷阱與缺陷》給出答案:(*(void(*)())0)();

相關知識:函式指標

函式指標是指向函式的指標變數,即本質是乙個指標變數。

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

指向函式的指標包含了函式的位址,可以通過它來呼叫函式。宣告格式如下:

型別說明符 (*函式名)(引數)

其實這裡不能稱為函式名,應該叫做指標的變數名。這個特殊的指標指向乙個返回整型值的函式。指標的宣告必須和它指向函式的宣告保持一致。

//

函式指標示例:

void func(int x, int y);   //宣告乙個函式

void(*f) (int, int); //

宣告乙個函式指標

f=func; //

將func函式的首位址賦給指標f

(*func)(1, 2)

//呼叫形式,

等價於func()

問題分析:

1、想要呼叫這段程式(子例程),設為func函式,由上述相關知識,我們可以使用最基本的指標函式void(*f) ()來呼叫子例程,呼叫方法:(*func)();

2、子例程儲存在起始位址為 0的一段記憶體上,故可理解為0是這個子例程的入口位址,func函式入口位址為0。即func指向位址為0的函式;

3、由2知,func為指向位址0的函式,所以func是乙個函式指標,設func是乙個指向返回值為void型別的函式的指標,故可設func的函式指標宣告為void (*pfunc)();

4、由函式宣告void (*pfunc)()模擬於變數宣告,同樣,通過強制轉換,我們可以得到位址為0的入口函式位址(void (*)())0;

5、將4代入1中,即有(*(void (*)())0)().

其他:指標函式:

乙個函式不僅可以帶回乙個整型資料的值,字元型別值和實型型別的值,還可以帶回指標型別的資料,使其指向某個位址單元。

返回指標的函式,一般定義格式為:型別識別符號    *函式名(參數列)

示例:int *f(x,y);

函式指標是乙個指向函式的指標,而指標函式只是說明他是乙個返回值為指標的函式。

void* 指標:

c++提供了一種特殊的指標型別void*,它可以儲存任何物件型別的位址(c++ primer)。

參考:

函式指標的宣告

typedef函式指標的宣告與其他型別的宣告有所不同,主要遵守右左法則,具體的解釋如下 1.1 解讀的原則 右左原則 右左法則 首先從最裡面的圓括號看起,然後往右看,再往左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號裡面所有的東西,就跳出圓括號。重複這個過程直到整個宣告解析完畢。個人認...

C 函式指標的宣告與使用

一 函式指標是什麼 1.函式指標是指標 2.函式指標該如何宣告?我們可以和int型別的指標的宣告進行比對一下 宣告乙個int型指標 int p 宣告乙個函式型 假如是乙個有兩個int型別的引數以及乙個 int型別的返回值 的指標 int pfunc int,int 我們把指標名稱提出來看一下,整形指...

函式指標與指標函式

指標函式 指標函式是指函式的返回值型別是乙個指標型別,即本質是乙個函式。我們知道函式都有返回型別 如果不返回值,則為無值型 只不過指標函式返回型別是某一型別的指標。其定義格式如下所示 返回型別識別符號 返回名稱 形式參數列 返回型別可以是任何基本型別和復合型別。返回指標的函式的用途十分廣泛。事實上,...