c++介绍函数指针 十

embedded/2025/3/17 22:25:21/

指针代表内存中地址标识符,变量,数组都是存储内存中的数据。所以可以获得它们的地址,用指针来表示这块内存。

如图输出内存中的地址。

对于一个函数来说,也是内存中存储这段数据,所以我们也可以获取函数的地址。

函数指针的声明方式

 

下面我们来看一个简单函数指针使用

#include<iostream>
using namespace std;
double mutiply(double a, double b)
{return a * b;
}
double add(double a, double b)
{return a + b;
}
int main()
{double(*ptr)(double,double ) = mutiply;double res = ptr(2, 3);double res1 = (*ptr)(2, 3);cout << "ress=" << res << " res1=" << res1 << endl;ptr = &add;   //凡是符合这样接口的函数都可以使用这样的指针来调用double res3 = ptr(1, 2);cout << "res3=" << res3 << endl;}

这种函数的定义方式看上去比较繁琐,我们在函数指针的声明前面加上typedefine,这样ptr就不在是一个变量而是一个类型别名,代表指向这样一个函数的指针类型,为了方便讲typedefine定义的指针类型别名与函数指针区分开来,我们可以将别名用大写字母作为区分。

代码如下

#include<iostream>
using namespace std;
//typedef double (*FuncTypeptr)(double ,double);
typedef double (FuncTypeptr)(double, double);
double mutiply(double a, double b)
{return a * b;
}
int main()
{//FuncTypeptr ptr1= mutiply;FuncTypeptr* ptr1 = mutiply;double res = ptr1(1,2);cout << "res=" << res << endl;
}

 

函数指针在C语言中的使用

在排序函数中传入compare函数指针,这样排序函数就可以通过闯入的指针来判断数值的大小。

代码如下

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
bool compare(float a, float b)
{return a < b;
}
int main()
{vector<float>num{ 0,1,2,3,6,3,7,11 };sort(num.begin(), num.end(), compare);for (auto a : num)cout << a << " ";
}

在c++中我们可以通过重载一个类的函数运算符,来实现函数对象,使用函数对象代替函数指针。

代码如下

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Compare
{
public:bool operator()(float a, float b){return a < b;}
};
int main()
{vector<float>num{ 0,1,2,3,6,3,7,11 };sort(num.begin(), num.end(), Compare());for (auto a : num)cout << a << " ";
}

 

 

#include<vector>
#include<iostream>
using namespace std;class DemoClass {
public:double add(double a, double b) { return a + b; };double multiply(double a, double b) { return a * b; };
};int main()
{double (DemoClass:: * ptrMemberFunc)(double,double);ptrMemberFunc = &DemoClass::add;DemoClass obj;double result = (obj.*ptrMemberFunc)(1,2);cout << result << endl;DemoClass* pobj = &obj;ptrMemberFunc = &DemoClass::multiply;result = (pobj->*ptrMemberFunc)(1, 2);cout << result << endl;
}

 同样适用于多态类中的虚函数

 


http://www.ppmy.cn/embedded/173440.html

相关文章

FFmpeg处理流程

结构体 AVFormatContext 作用&#xff1a;管理媒体文件的封装格式上下文&#xff0c;存储文件格式、流信息、I/O 操作等元数据。 关键字段 AVInputFormat *iformat; // 输入格式&#xff08;如MP4、FLV&#xff09; AVStream **streams; // 音视频流数组 int nb_str…

AI 游戏的创新与挑战都有哪些?

一、AI 游戏的创新 &#xff08;一&#xff09;技术突破 AI 技术的不断进步为游戏产业带来了新的机遇。深度学习、强化学习等技术的应用&#xff0c;使得游戏中的 AI 角色能够展现出更加智能的行为和决策能力。例如&#xff0c;通过强化学习&#xff0c;AI 可以在游戏中自主学…

3ds Max 鼠标与快捷键组合操作指南

以下是 3ds Max 鼠标与快捷键组合操作指南&#xff0c;按功能分类整理&#xff0c;涵盖 视图控制、对象操作、建模工具 等核心场景。自用记录&#xff0c;不喜勿喷。 一、视图控制&#xff08;鼠标核心操作&#xff09; 操作快捷键鼠标动作功能说明平移视图鼠标中键拖动按住中…

PCDN 与边缘计算的结合​

在数字化时代&#xff0c;PCDN 与边缘计算作为两项前沿技术&#xff0c;正悄然改变着网络生态格局。PCDN&#xff0c;即点到点内容分发网络&#xff0c;它借助众多用户的闲置带宽与计算资源&#xff0c;构建起庞大的分布式网络&#xff0c;能有效提升内容传输效率。边缘计算则是…

涨薪技术|Kubernetes(k8s)之Pod生命周期(下)

上次推文我们学习了Pod生命周期&#xff08;上&#xff09;知识&#xff1a;相位、创建与终止、初始化容器&#xff0c;今天继续分享完余下的3个知识&#xff1a;钩子函数、容器探测、重启策略。 01钩子函数 钩子函数能够感知自身生命周期中的事件&#xff0c;并在相应的时刻…

谷歌手机LEA流程

谷歌手机LEA流程 连接管理首次连接手机回连 业务管理音乐业务通话业务 链路切换管理 本篇文章简单介绍了谷歌手机使用LE Audio连接TWS耳机中的实现细节&#xff0c;强调了持续广播机制、业务差异化处理、链路切换逻辑及加密安全性。核心目标是优化低功耗音频连接的稳定性和资源…

PyTorch 深度学习实战(11):强化学习与深度 Q 网络(DQN)

在之前的文章中&#xff0c;我们介绍了神经网络、卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;、Transformer 等多种深度学习模型&#xff0c;并应用于图像分类、文本分类、时间序列预测等任务。本文将介绍强化学习的基本概念&#xff0…

基于Alpine构建MySQL 10.11.11镜像的完整教程

基于Alpine构建MySQL 10.11.11镜像的完整教程 在容器化技术日益流行的今天&#xff0c;使用Docker构建高效、轻量级的MySQL镜像成为许多开发者的需求。本教程将详细介绍如何基于Alpine Linux构建MySQL 10.11.11镜像&#xff0c;Alpine Linux以其小巧的体积和快速的启动速度而闻…