c語言函數指針和指針函數,二十一天學通C語言:函數型指針

 2023-12-09 阅读 14 评论 0

摘要:rel="File-List" href="file:///C:%5CDOCUME%7E1%5CAdmin%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 二十一天學通C語言:函數型指針 本文節選自《21天學通C語言》一書 ??? C程序中的函數也都是存放在代碼區內的,它
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CAdmin%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">二十一天學通C語言:函數型指針
本文節選自《21天學通C語言》一書

??? 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 <stdio.h>
02?? ?
03?? ?int add(const int a, const int b) {?? ??? ??? ?/* 定義add函數 */
04?? ??? ?return a + b;
05?? ?}
06?? ?
07?? ?int main(void) {
08?? ??? ?int (*fp) (const int a, const int b);?? ??? ?/* 定義函數指針 */
09?? ?
10?? ??? ?fp = add;?? ??? ??? ??? ??? ??? ??? ??? ?/* 將其賦值為add */
11?? ??? ?printf("3 + 4 = %d/n", fp(3, 4));?? ??? ??? ?/* 使用fp計算+ 4的值 */
12?? ??? ?printf("3 + 4 = %d/n", (*fp)(3, 4));?? ??? ?/* 使用*fp計算+ 4的值 */
13?? ?
14?? ??? ?printf("%p/n", add);?? ??? ??? ??? ??? ??? ?/* 輸出add的值 */
15?? ??? ?printf("%p/n", &add);?? ??? ??? ??? ??? ??? ?/* 輸出add的地址 */
16?? ??? ?printf("%p/n", fp);?? ??? ??? ??? ??? ??? ?/* 輸出fp的值 */
17?? ??? ?printf("%p/n", *fp);?? ??? ??? ??? ??? ??? ?/* 輸出fp指向的值 */
18?? ?
19?? ??? ?return 0;
20?? ?}
【運行結果】程序運行后。
?【代碼解析】本程序定義了一個函數指針,并將其賦值為相應類型的函數變量add。
??? ?第11~12行分別使用fp和*fp的方式調用函數,從圖14-12的第1~2行中可以看到它們的調用結果是一樣的。
??? ?第14~17行輸出了add的值和地址、fp的值和指向的值,從圖14-12的第3~6行中可以看到它們的調用結果都是一樣的。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/193971.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息