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:02 阅读更多 →
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:02 阅读更多 →
VMware虚拟机USB直通实战:笔记本摄像头连接与排错指南

VMware虚拟机USB直通实战:笔记本摄像头连接与排错指南

1. 为什么要在虚拟机里折腾摄像头把笔记本摄像头直通给 VMware 虚拟机,这个需求听起来小众,实际踩坑的人非常多。我最早碰到这个场景,是要在虚拟机里跑一个视频采集的测试程序,宿主机是 Windows,虚拟机里装的是 Ubuntu…

2026/9/26 13:03:26 阅读更多 →

最新新闻

Claude Code模板库实战:从提示词工程到高效AI编程工作流

Claude Code模板库实战:从提示词工程到高效AI编程工作流

有一段时间,我几乎每天都泡在 Claude Code 的终端界面里。代码生成、仓库调研、测试补全、重构迁移……用得越顺手,越发现一个问题:每次新任务开对话,我总要把同样一堆约束、角色设定、输出规范重新复制一遍。有时候粘错一段&…

2026/9/26 14:01:33 阅读更多 →
ESP32应用安装平台实战:OTA分区管理与Web固件切换

ESP32应用安装平台实战:OTA分区管理与Web固件切换

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

2026/9/26 14:01:33 阅读更多 →
Python 读取 Mysqldb cursor.fetchall() 结果转 JSON:TaoToken 统一 Key 配置与验证

Python 读取 Mysqldb cursor.fetchall() 结果转 JSON:TaoToken 统一 Key 配置与验证

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

2026/9/26 14:01:33 阅读更多 →
Claude学习笔记【第二章】- Claude Code的配置:TaoToken 统一 Key 接入 settings.json 骨架

Claude学习笔记【第二章】- Claude Code的配置:TaoToken 统一 Key 接入 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/26 14:01:33 阅读更多 →
通义灵码2.0迈入Agentic AI:TaoToken统一Key接入与settings.json配置实战

通义灵码2.0迈入Agentic AI:TaoToken统一Key接入与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/26 14:01:33 阅读更多 →
Oracle EBS AP预付款管理:发票录入、支付核销与状态流转全解析

Oracle EBS AP预付款管理:发票录入、支付核销与状态流转全解析

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

2026/9/26 14:00:33 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →