二十一天學通C語言 函式型指標

2022-10-11 12:21:10 字數 1427 閱讀 6706

二十一天學通c語言:函式型指標

本文節選自《21天學通c語言》一書

c程式中的函式也都是存放在**區內的,它們同樣也是有位址的。那麼如何取得函式的位址呢?在前面也說過函式定義的時候實際上是定義了乙個函式變數,那麼是否可以將函式變數賦值給其他變數呢?回答這些問題需要涉及另外乙個概念:函式型指標。按照已有的指標的知識,顧名思義,函式型指標就是指向函式的指標。如果有乙個函式宣告為:

int func(const int a, const int b);

那麼,此時宣告的函式變數add的位址即為這個函式的位址,同時,add的值儲存為這個函式的位址,這個特性與陣列相似:陣列變數與陣列變數的位址均為陣列的起始位址。而在這個函式宣告中,函式型別為int (const int a, const int b)。使用該函式型別來定義乙個函式型指標,其方式如下:

int (* fp)(const int a, const int b);    /* 其中,引數列表的引數名a和b可省 */

上述語句將變數func定義為指向型別為int (const int a, const int b)的指標操作符和變數名兩側的小括號不可省,否則其含義大不相同。例如:

int * fp(const int a, const int b);

此時,指標操作符與資料型別int結合為int型指標型別,該語句只是宣告了乙個fp函式,而非定義乙個函式指標。為該函式型指標賦值的方式如下:

fp = func;

被賦值的函式變數的型別必須與fp的型別完全一致,包括其返回型別和每乙個形參的型別。否則程式將報錯。

注意:函式型指標變數賦值時,左值與右值的型別必須完全一致。

使用函式型指標變數呼叫函式的方法與使用函式變數類似,得到函式位址後再帶上引數列表即可。可以使用下面兩種方式來呼叫函式:

fp(5, 6);

或(*fp)(5, 6);

由於fp被賦值為函式變數func的位址,而func的值又等於其位址,所以*fp可以得到func函式的位址。因此,在呼叫方式上,可以粗略地將兩者視為一致(實際上其後台的處理略有不同)。範例14-7演示了如何使用函式型指標來呼叫函式。

【範例14-7】使用函式型指標來呼叫函式,實現方法如示例**14-7所示。

示例**14-7

01    #include

02    

03    int add(const int a, const int b)

06    

07    int main(void)

【執行結果】程式執行後。

【**解析】本程式定義了乙個函式指標,並將其賦值為相應型別的函式變數add。

    第11~12行分別使用fp和*fp的方式呼叫函式,從圖14-12的第1~2行中可以看到它們的呼叫結果是一樣的。

    第14~17行輸出了add的值和位址、fp的值和指向的值,從圖14-12的第3~6行中可以看到它們的呼叫結果都是一樣的。

二十一天學通C語言 使用const宣告指標變數

二十一天學通c語言 使用const宣告指標變數 本文節選自 21天學通c語言 一書 已經學習了使用限定詞const宣告變數可以帶來很多好處。同樣地,限定詞const也可以用來宣告指標變數。根據const關鍵字在宣告中出現位置的不同,可以得到多種const指標型別,下面將依次進行講解。為方便表述,以i...

二十一天學通C 之使用throw丟擲異常

使用throw丟擲異常 本人節選自 21天學通c 一書 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 如果在try語句塊的程式段中 包括在其中呼叫的函式 發現了異常,且拋棄了該異常,則這個異常就...

二十一天學通C 之異常處理機制

異常處理機制 本人節選自 21天學通c 一書 c 並不是第乙個對結構化執行期錯誤處理進行支援的語言。早在20世紀60年代,pl 1就提供了一種內建的異常處理機制 ada也在20世紀80年代提供了自己的異常處理,而c 是在1989年時才有了異常處理機制。但是,c 的異常處理是獨一無二的,並且其已經作為...