当前位置: 首页 > news >正文

c++介绍函数指针 十

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

如图输出内存中的地址。

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

函数指针的声明方式

 

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

#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;
}

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

 

相关文章:

  • 面试高频#LeetCode#Hot100-字母异位词分组
  • Generative Image Dynamics(动态图像生成)
  • uni-app学习笔记——自定义模板
  • 基于 GEE 的城市热岛效应分析——可视化地表温度 LST 与归一化植被指数 NDVI 的关联
  • <03.13>八股文补充知识
  • 24个希腊字母
  • Unity中WolrdSpace下的UI展示在上层
  • AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤
  • JAVA面试_进阶部分_dubbo负载均衡策略
  • uniapp APP使用web-view内嵌 h5 解决打包发版浏览器有缓存需要清除的问题
  • IO多路复用——epoll(20250307)
  • 关于Linux contOS 7 的防火墙
  • 蓝桥杯 之 回溯之充分剪枝
  • 深度学习优化算法全面解析:从理论到实践
  • PyTorch vs NumPy:核心区别与选择指南
  • wow-rag:task2-正式上路搞定模型
  • 红帆 iOffice M2 移动端密码爆破的渗透测试思路,绕过客户端实现Burpsuite批量跑,分享渗透思路,共建网络安全
  • 二维数组基础
  • BLEU评估指标
  • 静态程序分析
  • 国内做外贸网站的有哪些资料/app推广怎么做
  • 长沙专业网站设计平台/中国品牌策划公司排名
  • 软件开发模式/seo怎么刷关键词排名
  • 网站顶部地图代码怎么做的/杭州seo的优化
  • 建设工程质量监督竣工备案网站/湖南百度推广代理商
  • 新疆建设质监站网站/seo关键词快速获得排名