首页/新闻资讯/正文详情

C++函数指针的用法详解

发布时间:2026/9/25 10:09:03 来源:云帆数科 栏目:资讯中心
C++函数指针的用法详解
函数指针初识函数指针是指向函数的指针,并不等于函数它能够执行函数的操作可以跟指针变量一起来理解其基本声明格式为:1type (*ptrname)(形参列表);例子声明一个比较两个字符串大小的函数指针1bool(*cp)(conststring s1,conststring s2);需要注意的是不要去掉括号!!!如果去掉括号含义就变成了返回一个bool指针的函数的声明函数指针指向函数类型在使用函数指针时函数指针可以发挥与函数相同的功效即也可以起到执行任务的作用但是函数指针需要初始化而且不存在函数指针类型的转换在进行初始化的时候函数指针可以被赋值为nullptr或常量NULL,或者指向一个函数但是指向这个函数时需要有严格的要求它需要严格按照两者的返回类型形参列表相对应例子12345678910111213141516// 两个示例函数bool compareLength(const string s1, const string s2){//当s1的长度大于s2的长度返回true否则返回falsereturn s1.size() s2.size()?true:false;}int getLength(const string s1){//返回字符串的长度return s1.size();}// 初始化前面定义的cp函数指针cp nullptr; // 正确初始化为空cp NULL; // 正确初始化为空常量NULLcp compareLength; // 正确函数的返回形式和形参列表和类型都是一样的cp getLength; // 错误返回类型和形参列表不一样使用函数接着上面的思路函数调用的方式可以这样写12345678// 函数指针调用函数cp(s1, s2);// 调用2(*cp)(s1, s2);// 函数调用与cp一样compareLength(s1, s2);函数指针作为形参使用可以将函数或者函数指针作为某一个函数的形式参数传入并使用如C11的thread头文件线程的构造函数中急需要传递一个函数指针的实例123#includethreadstd::threadt(函数指针, ..Args);其声明定义形式如下比如将上面定义的函数或函数指针传入一个新的函数中作为两者的比较依据12345678910intpackageFunc(conststring s1,conststring s2,boolcomp(conststring s1,conststring s2)){if(comp(s1, s2)){coutYesendl;}else{coutNoendl;}}// 或者以指针的形式来声明函数形参, 这种定义与上面那种定义是等价的intpackageFunc(conststring s1,conststring s2,bool(*cp)(conststring ,conststring ));考虑到这样的形式参数声明太过冗长可以使用typedef和decltype来简化操作比如上面代码又可以这样写123456typedefboolFunc(conststring,conststring);intpackageFunc(conststring s1,conststring s1, Func);// 或者写成这样这条语句与上面的typedef声明语句等价typedefdecltype(compareLength) Func2;intpackageFunc(conststring s1,conststring s1, Func2)或者定义成函数指针的形式123456typedefbool(*fp)(conststring ,conststring );intpackageFunc(conststring s1,conststring s2, fp)// 定义成函数指针的形式与上面的声明等价typedefdecltype(compareLength) *fp_ptr;intpackageFunc(conststring s1,conststring s2, fp_ptr)或者还可以这样写1usingfp bool(*)(conststring ,conststring );typedef是自定义数据类型的声名符可以用于定义自己的数据类型与using有相似的地方decltype:它返回一个函数类型即对传入的函数类型进行处理返回一个返回类型和形参定义都与传入函数相等的函数类型但是它无法将返回的函数类型自动转变为函数指针所以再需要函数指针是要加*号函数指针作为返回值函数指针也可作为返回值比如传统的Unix进程间通过signal通信的方式的signal函数就会返回函数指针类型如1234#includesignal.h函数指针 signal(SIGABRT, 函数句柄);// 其返回的就是一个函数指针即上一个与这个信号绑定的函数句柄如果是第一次绑定返回NULL但是函数类型不可依据上面的简要声明123456usingF int(int*,int);usingPF int(*)(int*,int);PF f1(int);// 正确PF为指函数的指针F f2(int);// 错误F为函数类型F* f3(int);// 正确显式的制定了函数返回函数指针的形式也可以直接声明但是不太好理解会导致代码的可读性差不建议这样做1int(*f1(int))(int*,int);还可以以后置形式声明一个函数返回一个函数指针类型1auto f1(int) -int(*)(int*,int);练习编写函数的声明令其接收两个int形参并且返回类型也是int;然后声明一个vector对象零其元素执行函数的指针12345678910111213141516171819202122#includeiostream#includevectorusingnamespacestd;intfunc1(inta,intb){// 加法returnab;}intfunc2(inta,intb){// 减法returna - b;}intmain(intargc,char*argv[]){decltype(func1) *p1 func1, *p2 func2;vectordecltype(func1)* s {p1,p2};inta 10,b 5;printf(add:[%d %d %d]\n, a, b, s[1](a,b));printf(sub:[%d - %d %d]\n, a, b, s[1](a,b));}1add:[10 5 5]sub:[10 - 5 5]

相关推荐

OmniPeek无线抓包四步法:信道扫描到故障定位
OmniPeek无线抓包四步法:信道扫描到故障定位

简介:面向网络工程师、无线运维及安全审计人员的 OmniPeek 无线抓包图文教程,围绕 WildPackets 出品的专业抓包软件,系统讲解有线/无线报文捕获、多协议解析与故障定位方法。资源为 1 个 docx 文档,压缩包大小 5.26MB,… · 2026/9/25 10:09:03

Databasus MongoDB SSL 测试体系:自签名证书、mongod TLS 启动参数与 TLS 备份恢复端到端验证
Databasus MongoDB SSL 测试体系:自签名证书、mongod TLS 启动参数与 TLS 备份恢复端到端验证

数据库灾备 【免费下载链接】databasus PostgreSQL backup tool with Point-In-Time-Recovery and restore verification 项目地址: https://gitcode.com/gh_mirrors/po/databasus 点击查看 免费下载 本文以 Databasus 仓库中 MongoDB SSL 测试证书说明文档&#x… · 2026/9/25 10:09:03

IDM浏览器插件下载提速原理与403问题排查指南
IDM浏览器插件下载提速原理与403问题排查指南

如果你的下载生涯里也出现过这样一幕:在百度网盘网页端点下“下载”,浏览器自带下载器以几十KB/s的速度爬行,你想起有人推荐过IDM,于是顺手把下载链接复制进去、点开始,结果等来一个403。别急着卸载IDM,问题… · 2026/9/25 10:09:03

VSCode、Cursor、Trae 终端无法识别 cnpm/npm/pnpm 的排查与修复:一份可复制的 settings.json 配置
VSCode、Cursor、Trae 终端无法识别 cnpm/npm/pnpm 的排查与修复:一份可复制的 settings.json 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 10:40:27

成都口碑好的全屋定制源头工厂有哪些 慕依定制实力盘点
成都口碑好的全屋定制源头工厂有哪些 慕依定制实力盘点

全屋定制行业的4大普遍踩坑难题你有没有想过,花了大几万甚至十几万定制全屋柜类,最后却出现这些问题? 效果图看着完美,落地后缝隙歪扭、尺寸不对、和预期完全不符:很多业主第一次做全屋定制都踩过这个坑,设计师只会画… · 2026/9/25 10:40:27

上海彬鑫钢膜结构工程有限公司满意度怎么样
上海彬鑫钢膜结构工程有限公司满意度怎么样

从2007年上海奉贤青港工业园的一隅到如今长三角膜结构行业的中坚力量,上海彬鑫钢膜结构工程有限公司走过了十九年的发展历程。十九年间,中国城市化进程加速推进,环保提标要求不断升级,公众对文体基础设施的需求持续增长&#xff0… · 2026/9/25 10:40:27

WorkBuddy Enterprise 企业级 Agent 平台:从 CodeBuddy 到团队协作的落地实践
WorkBuddy Enterprise 企业级 Agent 平台:从 CodeBuddy 到团队协作的落地实践

1. 从「超级个体」到「超级团队」:这个平台到底在解决什么问题第一次看到「WorkBuddy Enterprise」这个名字,我脑子里蹦出来的第一个念头是:腾讯这是要把 CodeBuddy 那套单兵作战的能力,往组织级别去推了。过去一年我一直在用 Cod… · 2026/9/25 10:40:08

代码随想录/hello-algo学习笔记——二叉树
代码随想录/hello-algo学习笔记——二叉树

二叉树的基本概念 二叉树是一种非线性的数据结构,由每个节点一分为二引出两个子节点(类似高中生物学到的祖先后代的结构图,但二叉树是一个节点只能有两个子节点)。 基本单元:结点。每个节点包含值和两个引用&#xff0… · 2026/9/25 10:39:56

A2A供需匹配为什么不能只靠向量相似度
A2A供需匹配为什么不能只靠向量相似度

更新说明(2026年9月23日):本文是历史技术方案记录。当前 MapleBridge 用于采购询价、邀请买家已有的供应商联系人与报价比较,不提供供应商搜索、工厂核验或自动撮合。B2B 供需匹配为什么不能只靠向量相似度 最近在做一个 B2B 供需… · 2026/9/25 10:39:56

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码