C++函数指针语法和类型
函数指针是 C/C 中一种将函数地址作为变量存储和传递的机制它允许程序在运行时动态选择并调用不同的函数是实现回调、策略模式和插件系统的核心基础。核心语法结构函数指针的声明语法遵循“返回类型 (*指针名)(参数列表)”的格式。例如声明一个指向“接收两个 int 参数并返回 int”的函数的指针int (*funcPtr)(int, int);int表示该指针所指向的函数返回值类型为 int。(*funcPtr)括号内的*表示这是一个指针funcPtr是指针变量名。(int, int)表示该指针只能指向参数为两个 int 的函数。赋值与调用函数名本身即代表其入口地址因此可以直接赋值给函数指针int add(int a, int b) { return a b; } funcPtr add; // 或 funcPtr add;调用时只需像普通函数一样使用指针变量int result funcPtr(3, 4); // result 7使用 typedef 简化类型为避免每次声明都写冗长的语法通常使用typedef或using定义别名typedef int (*MathFunc)(int, int); // C风格 using MathFunc int (*)(int, int); // C11风格 MathFunc funcPtr add;成员函数指针的特殊性当指向类的非静态成员函数时语法需额外指定类作用域并使用.*或-*运算符调用class Calculator { public: int multiply(int a, int b) { return a * b; } }; typedef int (Calculator::*MemFunc)(int, int); MemFunc memPtr Calculator::multiply;//获取成员函数的“偏移量” Calculator calc; int result (calc.*memPtr)(3, 4); // 绑定对象并调用必须绑定具体对象核心概念这里的memPtr不是传统意义上存储内存绝对地址的普通指针。因为类Class只是一个模板在没有创建具体对象之前multiply函数在内存中并没有一个确定的绝对位置。成员指针如Calculator::multiply本质上存储的是一个偏移量Offset或相对位置信息。当你写下calc.*memPtr时编译器在底层做的事情是获取对象calc的内存基地址 成员指针memPtr中记录的偏移量 真正要访问的函数或数据的内存地址。真相memPtr实际上存储的是multiply函数在Calculator类内存布局中的偏移量Offset信息。它就像是一张“户型图上的标记”告诉你“这个函数在对象的哪个位置”但必须结合具体的“房子”才能使用。因为memPtr只有偏移量没有具体的内存地址所以它绝对不能脱离对象单独调用即不能直接写memPtr(3, 4)。必须将它与一个具体的对象绑定.*运算符这是 C 专属的“指向成员的解引用运算符”。它的作用是把必需是一个具体的对象左操作数和必须是一个成员指针右操作数绑定在一起从而访问该对象的具体成员数据或函数通过对象基地址创建对象时分配给这个对象的内存起始地址 偏移量找到真正的函数并调用。为什么必须加括号(calc.*memPtr)这是 C 语法中的一个易错点。因为函数调用运算符()的优先级高于.*运算符。如果不加括号编译器会尝试先执行memPtr(3, 4)从而引发编译错误。加上括号后编译器会先组合对象和指针再执行函数调用。如果你的calc对象是一个指针例如Calculator* pCalc calc;那么你需要使用-*运算符并且同样需要括号int result (pCalc-*memPtr)(3, 4);总结这段代码的本质是“延迟绑定”。它把“要调用哪个函数”memPtr和“在哪个对象上调用”calc分开了直到(calc.*memPtr)这一步才将它们合体并执行。这种机制在实现回调函数、策略模式或消息分发机制时非常有用成员函数指针的类型更特殊例如typedef void(A::*PF)();这种指针不仅规定了参数和返回值还绑定了类A。它只能指向类A的成员函数。它不能指向全局函数。它也不能指向类B的成员函数即使签名完全一样。例子class A { public: void foo() {} }; class B { public: void foo() {} }; typedef void (A::*PtrA)(); typedef void (B::*PtrB)(); PtrA p A::foo; // ✅ PtrA q B::foo; // ❌ 错误这是 B 的函数不是 A 的为了让你更透彻地明白我们可以对比一下不加和加了typedef的区别1. 不加typedef它就是一个【指针变量】void (A::*p)();在这里p是一个变量名。编译器看到*p就知道你要在内存里开辟一个空间用来存放地址。如果你想再定义一个同类的指针你必须把这一长串再抄一遍void (A::*q)();。2. 加了typedef它变成了一个【类型别名】typedef void (A::*PF)();在这里PF是一个类型名就像int或char一样。编译器看到typedef它的任务就变成了“起外号”。它把void (A::*)()这一长串复杂的语法打包成了一个简单的名字PF。此时内存里没有分配任何空间也没有产生任何变量。以后你想定义这种指针只需要写PF p;或PF q;就行了。总结没有typedefvoid (A::*p)()是在造零件声明变量。有了typedeftypedef void (A::*PF)()是在画图纸定义类型。典型应用场景回调函数将函数指针作为参数传递给另一个函数实现“事后通知”机制。策略模式通过切换不同的函数指针动态改变算法行为。函数表/跳转表用数组存储多个函数指针根据索引快速调用对应函数常用于状态机或命令解析器。现代替代方案C11 引入了std::function和lambda表达式提供了更安全、更灵活的替代方案#include functional std::functionint(int, int) func [](int a, int b) { return a b; };虽然函数指针在性能上仍有优势无额外开销但在大多数现代项目中推荐优先使用std::function以获得更好的类型安全和可读性。

相关新闻

Go服务生产环境的生存规则,你知道几条?

Go服务生产环境的生存规则,你知道几条?

Go 让你很容易就能写出一段“能编译、能通过冒烟测试、一遇到真实流量就跪”的代码。这门语言默认给你很少——没有运行时异常可以捕获,没有框架护栏,没有魔法。这是个特性,但这也意味着:让一个服务在生产环境活下去的规则&#x…

2026/8/23 23:48:50 阅读更多 →
后备箱里的汉中乡愁:一台车,装满故乡的烟火与牵挂

后备箱里的汉中乡愁:一台车,装满故乡的烟火与牵挂

对于很多汉中家庭,汽车后备箱,是独属于陕南人的乡愁容器。逢年过节从乡下返回城里,后备箱被父母塞得满满当当:自家腌制的腊肉、土蜂蜜、新鲜蔬菜、核桃馍,大大小小袋子塞满每一处缝隙。车子,成为城乡之间情…

2026/8/23 23:47:50 阅读更多 →
薄膜开关设计到开模的工程确认清单

薄膜开关设计到开模的工程确认清单

薄膜开关从设计文件完成到正式开模量产之间,存在一个工程确认环节。这个环节的目的是确保设计文件中的各项参数和要求能够在量产中稳定实现,避免开模后发现设计缺陷导致返工和延误。宝盛达在多年的薄膜开关制造服务中,总结了一套工程确认清单…

2026/8/23 23:47:49 阅读更多 →

最新新闻

GTA V 脚本插件 ScriptHookVDotNet 保姆级安装:3 个文件进游戏目录,跑通你的第一个脚本

GTA V 脚本插件 ScriptHookVDotNet 保姆级安装:3 个文件进游戏目录,跑通你的第一个脚本

GTA V 脚本插件 ScriptHookVDotNet 保姆级安装:3 个文件进游戏目录,跑通你的第一个脚本 【免费下载链接】scripthookvdotnet An ASI plugin for Grand Theft Auto V, which allows running scripts written in any .NET language on the .NET Framework …

2026/8/24 6:37:18 阅读更多 →
构建合规感知智能体支付系统:稳定币支付与金融监管的融合实践

构建合规感知智能体支付系统:稳定币支付与金融监管的融合实践

1. 项目概述:当稳定币支付遇上合规智能体最近和几个做跨境支付和DeFi的朋友聊天,大家不约而同地提到了一个痛点:用稳定币做支付,速度是快了,成本是低了,但合规这块儿总感觉像在走钢丝。一边是链上交易天然的…

2026/8/24 6:37:18 阅读更多 →
WSL2中CUDA环境配置全攻略:Windows下AI开发的最佳实践

WSL2中CUDA环境配置全攻略:Windows下AI开发的最佳实践

1. 项目概述:为什么要在WSL里折腾CUDA? 如果你是一个在Windows上做机器学习、深度学习或者高性能计算的朋友,大概率遇到过这样的困境:主力开发环境是Windows,方便日常办公和娱乐,但一到要跑模型、做训练&a…

2026/8/24 6:37:18 阅读更多 →
STM32开发三板斧:在线调试、看门狗与跑飞诊断实战指南

STM32开发三板斧:在线调试、看门狗与跑飞诊断实战指南

1. 项目概述:STM32调试的“三板斧”搞STM32开发的兄弟,尤其是做工业控制、汽车电子或者长时间运行设备的,最怕什么?不是代码写不出来,而是代码“跑飞了”。你辛辛苦苦调试好的程序,一上电跑个几天几夜&…

2026/8/24 6:37:18 阅读更多 →
大厂面试算法题解析与C++高性能编程实战

大厂面试算法题解析与C++高性能编程实战

1. 为什么大厂面试都爱考算法题?最近帮团队面试了几个C后端开发的候选人,发现一个有趣的现象:那些在算法题环节表现优秀的候选人,在实际编码和系统设计环节往往也能给出更优的解决方案。这让我想起自己当年准备面试时,…

2026/8/24 6:37:18 阅读更多 →
ECharts圆环图实战:解决多层嵌套、间隙与标题定位难题

ECharts圆环图实战:解决多层嵌套、间隙与标题定位难题

1. 从“能用”到“好看”:圆环图设计的三个核心痛点在数据可视化项目中,ECharts的饼图(type: pie)因其强大的定制能力,常被用来绘制各种圆环图。然而,从产品经理丢过来一张“参考图”到最终在页面上呈现一个…

2026/8/24 6:36:17 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →