C++那些细节--函数指针

C++函数指针与指针函数详解:从概念到实战应用 在C++编程中,指针是访问和操作内存的核心机制,它允许程序直接与硬件交互,实现高效的数据处理。函数指针作为指针的一种特殊形式,存储的是函数入口地址,而非数据地址,这使得程序能够在运行时动态选择并调用函数,实现了控制反转和策略模式等高级编程范式。这种机制在回调函数、事件驱动系统和算法定制等场景中具有重要技术价值,例如在排序算法中允许用户自定义比较逻辑,或在GUI框架中处理用户交互事件。本文聚焦于C++中易混淆的指针函数与函数指针,通过对比两者定义、语法差异及内存管理要点,并结合回调机制和std::functi 阅读详情

一.简介

C或者C++中最灵活的东东就是指针了,在操作一个对象,或者数组等等,我们常常用到指针,可以给编程带来很多灵活性。但是,指针不仅仅能指向固定数据类型或是对象,指针还可以指向函数,这就是所谓的函数指针。
有了函数指针,我们可以通过指针调用函数,更重要的是我们可以将函数指针作为参数传递给函数,进而可以进行完成注册,回调等等功能,可以说,有了函数指针,我们的程序可以设计的更加灵活了。

二.普通函数指针

1.函数指针的定义方式

看一个最简单的例子:
// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;

//定义一个函数指针
void (*pFunc)(int);

//声明并定义一个函数
void PrintInt(int i)
{
	cout<<i<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	//将函数赋给函数指针
	//不使用&符号也可以,因为函数名称本来就是函数的首地址,类似数组
	pFunc = &PrintInt;
	
	//通过函数指针来调用函数
	pFunc(1);
	//调用时也可以写的完整规范一些(*pFunc)(1)符合一般指针的标准

	system("pause");
	return 0;
}
结果:
1
请按任意键继续. . .

声明函数指针的时候,一般的格式为 返回值 (*函数指针名)(参数1,参数2...)但是这样声明有一个弊端,就是麻烦,每次需要一个函数指针的时候,都需要写这么一大串,很麻烦,所以我们就想到了用typedef这个关键字,定义某一种类型的函数指针,给它一个别名,这样,每次使用这种函数指针的时候就可以像定义一个int型变量那么简单。

比如上面的函数指针,我们就可以这样写:
// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;

//使用typedef定义函数指针,此时,pFunc就不再是函数指针本身的名称,而是这类函数指针的一个别名
typedef void (*pFunc)(int);

//声明并定义一个函数
void PrintInt(int i)
{
	cout<<i<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	//定义一个函数指针,并赋予其初始值
	pFunc func = PrintInt;
	
	//通过函数指针来调用函数
	func(1);
	

	system("pause");
	return 0;
}
结果:
1
请按任意键继续. . .

这样写之后,我们就定义了一种函数指针的类型,返回值为void,参数为int的函数指针,之后使用pFunc就可以很方便的定义这种类型的函数指针啦!



三.成员函数指针

成员函数指针是C++中最麻烦的东东之一,准确的说是非静态成员函数指针。

1.静态成员函数指针

静态成员函数指针与普通函数指针一样,我们看一个例子:

// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;

//Base类
class Base
{
public:
	static void Print(int num)
	{
		cout<<num<<endl;
	}
};

//定义一个静态成员函数指针
typedef void (*pFunc)(int);


int _tmain(int argc, _TCHAR* argv[])
{
	//将静态成员函数赋给函数指针
	pFunc func = Base::Print;

C++中的函数指针2(作为函数形参使用) 在《C++中函数参数类型为指针的指针》中提到,在C++中,每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化。因此,不能用函数当做其他函数的形参,因为在函数内部无法创建函数的副本。而函数的指针可以作为其他函数的参数,指针是可以在函数内部进行复制的。 1 定义包含有函数指针的函数 bool (*fp)(const string&); void userFp(const... 阅读详情

相关推荐

非法操作说明(菜鸟级)

在这里给菜鸟组的同志们带来一篇关于非法作的详细的解释

中科蓝讯(第一次使用指南)

中科蓝讯 新手指南

qq_48579018的博客 1万+

TWR-K65F180M评估板:基于Cortex-M4的嵌入式原型开发实战指南

在嵌入式系统开发中,微控制器(MCU)是核心,而围绕其构建的硬件平台则是将想法转化为可工作原型的关键。Cortex-M4内核凭借其高效的流水线、DSP指令集和浮点单元,为实时控制与信号处理提供了强大的运算能力。其技术价值在于,能够在较低功耗下满足工业控制、物联网网关等场景对能效比的严苛要求。为了快速验证系统设计,开发者常使用成熟的评估板来规避底层硬件设计的风险,直接聚焦于应用开发。本文以恩智浦的TWR-K65F180M评估板为例,深入解析其基于**ARM Cortex-M4**内核的K65 MCU的硬件架构

weixin_33582311的博客 370

【EMC电磁兼容】02.04——原理图的实战落地细节

原理图上的关于EMC的落地体现一、元器件的选型二、原理图上的EMC体现在哪里?1.芯片电源管脚滤波去耦:2.时钟电路滤波设计3.低速电路滤波抗干扰设计4.通讯接口电路的防护滤波5.系统输入电源端口电路的防护滤波6.系统接地的定义7.芯片软件功能的审查 一、元器件的选型 ​ 原理图最初设计涉及到选型元器件方面: 元器件选型 不仅仅功能需要满足要求,还需要考虑其它细节参数在不同应力下的反应,封装的不同也会产生不同的变化。 元器件替代 常常因为成本原因进行器件替代,除了要考虑功能参数相同时也要考虑系统参数

Time to Forget 2243

高级图像增强——模拟雨天,雾,雪,阳光,阴影,运动模糊,畸变等14种效果,同步扩充标签文件

本文提供了一些高级的,特殊的图像增强方法,具体包括、光。

Limiiiing的博客 1308

高通SDX35:SGMII接口PHY RTL8211FSI-CG驱动适配

高通SDX35 RTL8211F SGMII

不秃头的程序猿Gabriel的博客 785

【异常】Nacos 2.x 核心报错:Server check fail (gRPC 端口连不通) 深度排查

如果 Nacos 运行在 K8s 中,需确保对应的Servicemetadata:spec:ports:port: 8848port: 9848 # 必须暴露此端口selector:app: nacos在 Nacos 2.x 时代,“端口成套出现”是基础设施配置的基本要求。遇到连接失败时,首要检查的不是业务配置,而是网络链路上主端口 + 1000的 TCP 通讯是否被放行。更多关于 AI + 教育领域的干货,可以关注我的微信公众号一时间获取哦~

奶爸的编程之路,也就一周冷个三天 324

基于ESP32的智能健康监测系统开发

本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。

2201_76125393的博客 1104

Vue3 - 完美解决高德地图定位失败 Get ipLocation failed.Geolocation permission denied.(获取ipLocation失败。地理定位权限被拒绝。)

Get ipLocation failed.Geolocation permission denied.,vue3引入高德地图当前定位失败 ,vue3中使用高德地图定位报错,高德地图API用户定位失败,高德地图H5 定位失败报错排查和解决方案,微信公众号H5网页高德地图定位报错,谷歌浏览器-高德地图定位失败geolocation,getCurrentPosition 返回的 message报错,如何解决此问题,uniapp h5高德地图,微信、QQ等内置浏览器定位失败,高德地图实现实时用户位置定位,引入高德

🏆 前端领域优质创作者 4169

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: VS2012工程用2010打不开的以及error LNK1123: failure during conversion to COFF的解决方案
下一篇: 为何我工作十年,内心仍无比恐慌(腾讯产品总监曹菲)
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值