C++入坑系列(五)之函数指针

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测 阅读详情

前言

简而言之,函数指针就是函数的地址。我们可以与数组进行类比,数组的数组名就是数组的首地址,而函数的地址就是函数名。

获取函数的地址

在实际使用中,我们可以直接通过访问函数名的方式便可以获得函数的地址,如下:

void test(void);
int main()
{
	cout << "test函数的地址为" << test << endl;
	return 0;
}
void test()
{
	//Do nothing 
}

输出结果:
在这里插入图片描述

函数指针的声明

声明函数指针的正确形式:

int (*test)(int a,int b);//声明一个具有两个int类型参数且返回一个int类型数据的函数指针,其中:(*test)代表函数,而test便代表了函数指针

调用函数指针

与普通变量访问对应地址的内容类似,在通过函数指针调用函数时,同样需要利用指针的解引实现操作。比如:

#include <iostream>
using namespace std;
void (*pointerTest)(int,int);
void test(int,int);
int main()
{
	pointerTest = test;
	(*pointerTest)(4,3);
	return 0;
}
void test(int a,int b)
{
	cout << a  << "\n" << b << endl;
}

输出结果:
在这里插入图片描述

函数指针作为其他函数的参数

在实际应用中,我们可以将函数的地址作为其他函数的参数进行使用。此时,便可能会涉及到函数指针的使用。
比如:由于各个国家之间的汇率是不同的,所以当其他国家需要将他们的本币换成人民币时,便需要按照不同的汇率进行计算,此时,我们便可以使用函数指针进行相应的计算。如下:

double EurToCny(int money)//欧元兑换为人民币
{
	return (7.7545 * money);
}
double AudToCny(int money)//澳元兑换为人民币
{
	return (4.7767 * money);
}
void exchange(int money,double (*pFun)(int))//人民币兑换
{
	cout << (*pFun)(money);
}
int main()
{
	cout << "2澳元兑换为:" << endl;
	exchange(2,AudToCny);
	cout << "人民币" << endl;
	cout << "10欧元兑换为:" << endl;
	exchange(10,EurToCny);
	cout << "人民币" << endl;
	return 0;
}

输出结果如下:
在这里插入图片描述

函数指针的应用场景

函数指针数组

顾名思义,便是由函数指针的数组。比如:

int* f1(const int*,int);
int* f2(const int*,int);
int* f3(const int*,int);//f1、f2、f3的函数声明
int* (*pFun[3])(const int*,int) = {f1,f2,f3};//声明一个函数指针数组,保存上述三个函数的地址
int testNum = 0;
int* funTets = pFun[0](&testNum,2);//将f1函数的返回值赋值给funTest指针变量
*funTets;//对f1函数的返回值进行解引,得到其指向内存的值

注意事项

在使用函数指针时,一定要注意以下内容:
1、函数指针的形式:
正确:

函数返回值 (*pFun)(参数列表)
其中,pFun是一个指向函数的指针

错误:

函数返回值 *pFun(参数列表)
其中,pFun是一个函数名,该函数返回一个指针

2、函数指针的形式必须与对应函数的形式相同,即返回值和参数列表必须一致,比如:

//正确的方式
const int testFun(int,int);
const int (*pFUn)(int,int) = testFun;
//错误的方式
const int testFun(double,int);
const int (*pFUn)(int,int) = testFun;//错误,参数列表不同

补充知识

函数原型的作用

函数原型即函数声明,C语言和C++均要求要么在调用函数之前定义被调函数,要么在调用函数之前对被调函数进行声明。那么,函数声明到底是什么作用呢?
实际上,函数声明提供了函数与编译器系统之间的一个接口。当函数调用被调函数时,编译器首先需要知道函数的返回类型和参数类型,以及函数名(地址),这样才能快速在代码中找到对应的函数。
我们假设不需要进行函数声明,那么当函数调用被调函数时,便需要在代码中依次寻找对应的函数,并且判断返回值和参数是否符合要求,更坏的情况是:当前的程序中并不存在被调用的函数,但是编译器仍然需要在查找完所有的代码之后才能发现这一问题,这样就在很大程度上降低了程序的执行效率。
而如果有了函数原型之后,编译器便可以直接调用对应地址处的函数,这样不就可以大大提高程序的执行效率了吗?!所以,函数原型在程序中是非常重要的,且大部分情况下都是必须的!

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法 阅读详情

相关推荐

在工作台 LS-DYNA 中检索和变换反作用力分量

在结构仿真中,通常需要由施加的位移或速度边界条件产生的反作用力。此外,通常需要根据用户定义的坐标系解析反作用力分量。在本文中,详细介绍了在Workbench (WB) LS-DYNA 中,相对于用户定义的坐标系检索和变换反作用力分量的过程。

jkh920184196的博客 885

关于c++变长参数列表总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34357436的博客 1177

Python异步协程爬虫优化:解决aiohttp中ServerDisconnectedError的高效策略

本文深入探讨了在Python异步协程爬虫中使用aiohttp时,如何高效解决常见的ServerDisconnectedError问题。核心策略包括全局复用ClientSession、精细配置TCPConnector连接池、实施请求重试与速率限制,从而构建稳定、高效的异步爬虫架构,有效避免服务器断开连接错误。

pz890123的博客 857

c++函数指针

函数指针函数指针基础知识深入探讨函数指针使用typedef进行简化 函数指针基础知识 1.完成函数指针需要的工作: 获取函数的地址 声明一个函数指针 使用函数指针来调用函数 1.获取函数地址:只要使用函数名即可。也就是说,如果think()是一个函数,则think()就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。一定要区分传递的是函数的地址还是函数的返回值: process(think); thought(think()); process()调用使得process()函数能够在其内部调

weixin_50866517的博客 1万+

从涡流求解器到瞬态场:Maxwell 3D里无线充电仿真,选对求解器能省一半计算时间

本文深入探讨了Maxwell 3D在无线充电仿真中涡流求解器与瞬态求解器的选择策略,帮助工程师优化计算效率与精度。通过对比分析两种求解器的适用场景、性能差异及实战技巧,揭示如何根据频率特性、材料非线性和动态过程需求做出精准选择,可节省高达50%的计算时间。特别针对3D线圈模型的无线充电系统设计提供了专业建议。

weixin_26861329的博客 230

腾讯云DBA面试(一面)

在第二阶段,根据RM返回的结果,如果涉及分布式事务的所有RM都返回可以提交, 则TM给RM发送commit的命令,每个RM实现自己的提交,同时释放锁和资源,然后RM反馈提交成功, TM完成整个分布式事务;根据事务所处的阶段,可以回滚到具体的版本,实现一致性。1.并发执行的事务,在prepare阶段,redo log先写文件缓存,第一个领头的事务,在等待n个事务后, 在第一个事务去刷写磁盘时,会把同组的其他的事务,也一起刷写到磁盘上,这样就减少了刷盘的次数,降低了磁盘的IOPS。分布式锁是怎么实现的?

u012565458的博客 1977

C++函数指针用法

C++函数指针详细理解 函数指针初识 函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为: type (*ptrname)(形参列表); 例子,声明一个比较两个字符串大小的函数指针 bool (*cp)(const string s1, const string s2); 需要注意的是,**不要去掉括号!!!**如果去掉括号,含义就变成了返回一个bool指针的函数的声明! 函数指针指向函数类型 再使用函数指针时,函数指针可以发挥与函数相同的功效,即

qq_48201696的博客 8374

51单片机——LCD12864驱动函数深度解析与实战优化

本文深入解析了51单片机驱动LCD12864液晶屏的核心驱动函数,从底层时序、关键延时到地址计算进行逐行剖析,并针对常见显示问题提供系统性的调试技巧与实战优化方案。重点探讨了如何将基础代码优化为稳定高效的驱动,涵盖延时精准化、批量写入及显示缓冲区等高级技巧,旨在帮助开发者从“点亮”屏幕进阶到“精通”驱动,确保显示稳定可靠。

weixin_29190169的博客 84

C++函数指针详解

详细讲解函数指针的作用,声明,赋值,使用,附有代码。

猫ER 5300

使用geneHapR进行基因单倍型分析(以vcf文件为例)

如下图所示,可以看到,用户需要准备的包括:基因型文件、注释文件和样本信息文件,以及后续会用的表型文件。输出的主要内容有:变异位点的可视化、单倍型网络、地理分布、表型比较和连锁不平衡热图。geneHapR的工作流程。

沉香best的博客 5941

Atlas 300I Duo - vllm部署Qwen3-VL-8B-Instruct

本文介绍了在Ascend NPU环境下部署Qwen3-VL-8B大语言模型的步骤。主要包括:1)安装驱动、docker和vllm镜像;2)创建特权容器并挂载设备与目录;3)进入容器安装指定版本的transformers;4)设置环境变量和NPU卡配置;5)启动vllm服务;6)测试API接口。部署过程涉及多块NPU卡的使用,需注意内存碎片化问题,最终通过vllm框架提供模型推理服务。

m0_50105717的博客 1561

C++中函数指针的使用

在C/C++中存在着函数指针,即指向函数的指针。我目前已知的两种使用方法是:    #include #include typedef int* PINNT; #define PP int* int funcA(int a,int b); int funcB(int* a,int *b); int main(int argc, char *argv[]) { int (*func)

sruru的专栏 6万+

【QT开发教程】使用Qt进行蓝牙低功耗(BLE)编程

蓝牙低功耗(BLE,Bluetooth Low Energy)技术广泛应用于现代设备中,例如智能手表、健身追踪器和物联网设备。Qt提供了一套完整的Bluetooth模块,使开发者可以轻松地在应用程序中实现BLE通信功能。本文将介绍如何在Qt中进行BLE编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 2868

C/C++:函数指针

要声明和初始化函数指针,首先需要知道要指向的函数的签名(返回类型和参数类型)。然后,你可以声明一个函数指针变量,并将其初始化为指向特定函数的地址。

2301_79181030的博客 1900

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ 函数指针的声明与使用

C++函数指针 一 函数指针是什么 1.函数指针是指针 函数指针也是指针的一种,是指针的子集,所以它应该有指针的一些特性; 函数指针也附带了函数的一些特性。 2.函数指针该如何声明? 我们可以和int类型的指针的声明进行比对一下: 声明一个int型指针: int *p ; 声明一个函数型(假如是一个有两个int类型的参数以及一个 int类型的返回值)的指针: int (*pFunc)(int, int); 我们把指针名称提出来看一下, 整形指针 函数指针 int * int (*)(

逢歌的博客 7621

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

cpp中函数指针

与数据项相似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。可以编写将另一个函数的地址作为参数的函数。这样第一个函数将能够找到第二个函数,并运行它。与直接调用另一个函数相比,这种方法很笨拙,但它允许在不同事件传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。python中函数是一等公民,装饰器就是传函数。 1.函数指针的基本知识 假设要设计一个名为estimate()的函数,估算编写指定函数代码的时间,并且希望不同的程序员都将使用该函数。在py就...

liguandong 2152

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c++ 将函数指针存入map中调用

1、普通函数指针 #include "stdafx.h" #include<map> #include<string> #include"FunMap.h" #include<stdio.h> typedef int(*FUN1)(int a); int a(int i) { printf("类外函数指针存入map调用%d\n",i); return 9; } int main() { map <int, FUN1> mapfun; mapf

bhbhhyg的博客 4514

C++知识点-函数指针

初识C++中函数指针时感觉其就是一种函数式编程的实现,主要实现的功能是可以将函数当作参数传入其他函数中。 与数据项类似,函数也有地址。**函数的地址是存储其机器语言代码的内存的开始地址。**这句话可能不太好理解,但是学过汇编后大致可以猜到函数指针就指向了函数汇编后一些列指令中的第一条指令。学好编程真是万丈高楼平地起,一定要把地基打好,即计算机的基础知识学好。 使用函数指针可以在不同的时间传递不同函数的地址,因此可以在不同的时间使用不同的函数,有点类似于策略模式的思想。 基础知识 要使用函数指针,大致需要完成

EJoft的博客 2287

C++如何定义一个函数指针

首先给出一个函数 int function(int a) { return a; } 一、定义一个函数指针 int (*fun)(int a); // 赋值 fun = function; // 使用 fun(2); 二、定义一个函数指针类型 typedef int (*function_p)(int a); //定义一个实体函数指针 funcyion_p fun; /...

xinwenhuayu的博客 1万+

C和C++的函数指针

这里int (MyClass::*member_func_ptr)(int)是类成员函数指针的声明,通过(obj.*member_func_ptr)(3)或者(ptr->*member_func_ptr)(3)的方式来调用成员函数。在这个例子中,func_ptr只能指向参数为int的print函数,不能直接指向参数为double的print函数。与类成员函数的结合(需要注意):在 C++ 中,普通函数指针不能直接指向类的成员函数,因为类成员函数有一个隐含的this指针。,这两种写法在 C 语言中是等价的。

wgf350357114的博客 1733

C++ Primer 函数指针

专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!

专注于C/C++编程语言的博客,如果读者对C/C++语言有任何需要咨询的可以私信联系! 1039

C/C++函数指针

函数指针 与数据项相似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。我们可以编写将另一个函数的地址作为参数的函数。这样第一个函数将能够找到第二个函数,并运行它。与直接调用一个函数相比,这种方法比较笨拙,但它允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。   (1)获取函数的地址 获取函数的地址很简单:只要使用函数名即可(后面不跟参数)。也就是...

Tyler_Zx的博客 5962

C++ 函数指针

C++ 函数指针

2201_75772333的博客 1692

C++函数指针学习

C++函数指针学习 博客搬家,原地址:https://langzi989.github.io/2017/09/08/C++函数指针学习/ 使用函数指针的优点 使用函数指针有助于我们设计出更优秀,更简洁更高效的程序。在下面的情景中我们常用到函数指针: 使用函数指针作为参数 使用函数指针作为返回值 使用函数指针作为回调函数 使用函数指针数组 类的静态方法和非静态方法的函数指针 使用函数指针实现动态绑...

langzi989的专栏 1857

C++的函数指针

在C/C++中,函数本质上是代码块的地址,而函数指针就是保存这个地址的变量。换句话说,函数指针是一个指向函数的指针。通过这个指针,你可以调用它所指向的函数。定义了一个名为的类型,它代表一个指向返回void且不接受任何参数的函数的指针。这个类型可以用来声明这样的函数指针,使代码更简洁和可读。

weixin_44259499的博客 1075
上一篇: 从源码到可执行文件
下一篇: C++入坑系列(七)之初探函数---内联函数、默认参数
「已注销」
博客等级 码龄7年 49粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值