網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
函數(shù)指針
為什么要使用函數(shù)指針?
- 調(diào)用的靈活性和通用性。
試想一下,我們?cè)谠O(shè)計(jì)初期并不知道我們的函數(shù)的具體實(shí)現(xiàn)細(xì)節(jié)。例如,我們我們想要一個(gè)排序函數(shù)qsort,但是具體排序法則我們并不確定,是降序還是升序,采用什么算法都不清楚。這些問(wèn)題是要在用戶調(diào)用這個(gè)函數(shù)的時(shí)候才能夠決定。于是調(diào)用者應(yīng)該自己設(shè)計(jì)comparator函數(shù),傳給qsort函數(shù)。
- 便于面向?qū)ο缶幊獭?/li>
例如我們?cè)O(shè)計(jì)一個(gè)結(jié)構(gòu)體apple。我們除了設(shè)計(jì)出蘋果的屬性比如,數(shù)量、重量、顏色外,我們還要定義關(guān)于蘋果的操作,比如,吃掉,種植,這時(shí)候我們可以使用函數(shù)指針。然后我們以后調(diào)用這個(gè)結(jié)構(gòu)體的時(shí)候,可以采用a.eat(&b)的方式調(diào)用函數(shù)。
typedef struct apple{ int number; double weight; colorType color; //some operations bool (*eat)(struct apple*); bool (*plant)(struct apple*); }apple;
語(yǔ)法
函數(shù)地址
函數(shù)的地址實(shí)際上就是函數(shù)名。這一點(diǎn)可以類比于數(shù)組。
聲明
要聲明指向特定類型的函數(shù)的指針,可以先編寫這種函數(shù)的原型,然后用(*pf)代替函數(shù)名。或者采用C++11 的auto也能聲明并初始化函數(shù)指針。
double pam (int); //這是函數(shù)原型 double (*pf)(int); //這是函數(shù)指針 auto pn=pam; //定義并初始化函數(shù)指針
使用函數(shù)指針調(diào)用函數(shù)
double pam (int); //這是函數(shù)原型 double (*pf)(int); //這是函數(shù)指針 auto pn=pam; //定義并初始化函數(shù)指針 pf=pam; pam(4); (*pf)(4); (*pn)(4);
直接把函數(shù)地址(即函數(shù)名)賦值給函數(shù)指針就行了,注意特征標(biāo)和返回類型必須相同。然后采用(*pf)(4)這樣的方式調(diào)用函數(shù)。實(shí)際上,C++也允許這樣子使用函數(shù)指針:
pf(4);//這種形式好看且實(shí)用,但是沒(méi)有顯示出 使用函數(shù)指針調(diào)用函數(shù) pn(4);
深入理解函數(shù)指針
閱讀這一篇幅,需要您熟練掌握,C語(yǔ)言中的指針。
//一些函數(shù)原型 const double* f1(const double ar[],int n); const double* f2(const double *,int); const double* f3(const double *,int); //函數(shù)指針 const double* (*p1)(const double ar[],int n)=f1; auto p2=f2;//感謝auto //調(diào)用函數(shù) cout<<(*p1)(av,3)<<*(*p1)(av,3); cout<<p2(av,3)<<*p2(av,3); //實(shí)際上 *p2(av,3)和*(*p2)(av,3)是一樣的。不理解的看上面內(nèi)容。 //包含3個(gè)函數(shù)指針的數(shù)組 const double* (*pa[3])(const double *,int)={f1,f2,f3}; //注意: //1、[]優(yōu)先級(jí)高于* 所以這是個(gè)數(shù)組不是指針。 //2、不能使用auto定義并初始化列表 auto pb=pa; //既然已經(jīng)聲明了數(shù)組,數(shù)組名就是指針,采用auto可以定義初始化指針,這是合法的。 //調(diào)用函數(shù) double x=*pa[0](av,3); double y=*(*pb[1])(av,3);//由于[]優(yōu)先級(jí)高于* 所以pb[1]是個(gè)函數(shù)指針。然后(*pb[1])就是調(diào)用函數(shù)了。 //更加深入 const double *(*(*pd)[3])(const double *,int) = &pa; //首先把函數(shù)指針的殼子去掉即 const double *(* ···)(const double *,int),然后得到(*pd)[3]這里 pd先和* 結(jié)合 再和[]結(jié)合,所以pd是個(gè)指針,這個(gè)指針指向一個(gè)數(shù)組,這個(gè)數(shù)組的元素又是函數(shù)指針。 //是不是特別繞? //感謝auto auto pc=&pa; //調(diào)用 (*pd)[0](av,3); //pd是指向數(shù)組的指針,則(*pd)[0]就是數(shù)組的元素,數(shù)組的元素是函數(shù)指針,所以可以采用這種方式調(diào)用函數(shù)。 //或者采用 (*(*pd)[0])(av,3)調(diào)用函數(shù)也是等價(jià)的。 double z=*(*pd)[0](av,3); //或者 采用 double z=*(*(*pd)[0])(av,3) 也是等價(jià)的
我們對(duì)于語(yǔ)法的了解不能僅僅潛于認(rèn)識(shí),對(duì)于這種const double *(*(*pd)[3])(const double *,int) = &pa;
我們不光要認(rèn)識(shí),更要會(huì)使用,再次重溫一遍,我們想要一個(gè)指向數(shù)組的指針,這個(gè)數(shù)組里的元素是函數(shù)指針。
第一步,數(shù)組元素的類型是函數(shù)指針,所以殼子要有 const double *(* ···)(const double *,int)
第二步,指向數(shù)組的指針 (*pd)[3]
,由于[]比*優(yōu)先級(jí)高,所以我們必須采用(),否則 *pd[3]
就是一個(gè)數(shù)組,數(shù)組的元素是指針。 第三步,結(jié)合得 const double *(*(*pd)[3])(const double *,int) = &pa
使用typedef 簡(jiǎn)化
typedef const double *(* p_fun)(const double *,int); p_fun p1=f1; p_fun pa[3]={f1,f2,f3}; p_fun (*pd)[3]=&pa;
typedef
使得代碼量減少很多,而且更容易理解
原文鏈接:https://blog.csdn.net/m0_71009069/article/details/125704471
相關(guān)推薦
- 2022-10-22 SQLMAP插件tamper編寫與使用詳解_MsSql
- 2022-03-19 .NET中的Husky工具及安裝方式_實(shí)用技巧
- 2022-06-12 基于Docker搭建iServer集群_docker
- 2022-07-24 C#導(dǎo)入和導(dǎo)出CSV文件_C#教程
- 2023-04-03 gin項(xiàng)目部署到服務(wù)器并后臺(tái)啟動(dòng)的步驟_Golang
- 2022-04-09 Android項(xiàng)目中g(shù)radle的執(zhí)行流程_Android
- 2022-05-12 Natapp(Ngrok) Windows下注冊(cè)為服務(wù),開(kāi)機(jī)啟動(dòng)&后臺(tái)運(yùn)行
- 2022-09-22 vite alias配置路徑地址別名
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支