函数指针的使用

2023-11-19

函数指针的初始化、调用方式

#include<iostream>
#include<cstdlib>
using namespace std;
 
int func()
{
	cout << "my name is yzy" << endl;
	return 0;
}
 
int main()
{
	int(*p)() = func;   //函数指针初始化方式1;由编译器完成函数名转化为函数指针隐式转换;
	int(*p1)() = &func; //函数指针初始化方式2;&显示转换;
 
	func();//函数调用方式1:函数名直接调用,编译时会现将函数名转化为函数指针;
	(*p)();//函数调用方式2:函数指针转化为函数名,再调用,编译时会现将函数名再转化为函数指针;
	p();   //函数调用方式3:函数指针直接调用
 
	system("pause");
	return 0;
}

 

1:函数指针初始化方式有两种:

方式2中的&操作符是可选的,因为函数名被使用时总是由编译器把它转化为函数指针,&操作符只是显示的说明了编译器将隐式执行的任务

2:函数调用方式有三种:

函数调用方式1:使用函数名调用函数,执行过程可能和你想象的不一样,函数名首先被转化为一个函数指针,该指针指定函数在内存中的位置,然后,函数调用操作符()调用该函数,执行开始于这个地址的代码。

函数调用方式2:首先对p执行间接访问操作,它把函数指针转化为一个函数名,这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把它转换回去。

函数调用方式3:省去了编译器的隐式转化

因此,通过函数指针调用函数时,最好选择方式3

 

3:函数指针的用途:

1:回调函数:用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数

2:转移表  :本质:一个函数指针数组

 

函数指针放置到map中

 

#include<iostream>
#include<string>
#include<map>
using namespace std;
typedef void(*test)(void);
void displayone()
{
        cout << "one" << endl;
}
void displaytwo()
{
        cout << "two" << endl;
}
int main(int argc, char* argv[])
{
        map<int, test> testMap;
        pair<int,test> p1 = make_pair(1,displayone);
        pair<int,test> p2 = make_pair(2,displaytwo);
        testMap.insert(p1);
        testMap.insert(p2);

        testMap[1]();
        (*testMap[2])();

        system("pause");
}

函数指针放在数组中

函数指针数组

/**定义函数**/
void funtion0( void );
……..
void funtion255(void );


/**定义函数指针数组**/

void (*fun[256])(void);
 
fun[0] = function0;
…….
fun[255] = function();


/**执行对应函数**/
int func_code ;
func_code = 10;
(*fun[func_code])();

参考:C++中函数指针数组的妙用 https://blog.csdn.net/weixin_30619101/article/details/98229191

用以代替if else, switch case 等语句,简化代码,提升执行效率。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数指针的使用 的相关文章

随机推荐

  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • 2022面试题汇总

    目录 浏览器下两个页面的通讯都有什么方式 使用css与js做一个九宫格动画 请输出如下的代码打印结果 js如何实现页面地址发生变化 但页面不发生跳转 请用js实现 请用多种方式实现垂直居中 实现的方式越多越好 请实现一个getValue函数
  • 【深度学习】全面直观认识深度神经网络

    01深度学习的精准定义 一类通过多层非线性变换对高复杂性数据建模算法的集合 它的两个非常重要的特征是多层性和非线性 俗称多层非线性变换 所以深度学习要去线性化 为什么呢 因为线性模型存在局限性 任意线性模型得到组合仍然还是线性模型 所以只要
  • Linux如何找回或者重置root用户密码

    欢迎参与个人独立开发的阅时即查web APP公测 请扫码体验 第一个为旧版 第二个为2019年6月版 在Linux这样一个权限管理严格 系统安全性要求高的环境中 根用户 超级用户 root的的密码显得十分重要 但是还是有一些马大哈会忘记自己
  • 【LLM】深入剖析 GOOGLE PALM 2:全面概述

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 用一维字符数组存放字符串

    一 用一维字符数组存放字符串 1 C语言对字符串的约定 字符串是借助于字符型一维数组来存放的 并规定以字符 0 作为字符串的结束标志 0 作为标志占用存储空间 但不计入串的实际常量 2 C语言中表示字符串常量的约定 虽然c语言中没有字符串数
  • regex_replace()函数的应用与解析

    include
  • lua报错 module 'Module' not found

    这几天学习lua使用require关键字获取自己定义的模块式 发现报没有这个模块文件 询问老师 老师说是因为中文路径问题 的确这个可能会出现问题 但是我修改后还是报这个错误 老师就让我看他的源代码 我确定没写错 所以还是要靠自己来解决了 终
  • 【sql语句基础】——查(select)(合并查询)

    目录 合并查询 单独查询 合并查询 UNION ALL UNION ALL定义 UNION ALL代码示例 UNION ALL查询结果 合并查询 UNION ALL UNION 定义 UNION 代码示例 UNION 查询结果 合并查询 当
  • Android Button 背景高度被拉伸问题

  • Linux音频之ASOC

    参考 https blog csdn net droidphone article details 7165482 1 ASOC简介 ASoC ALSA System on Chip 是建立在标准ALSA驱动层上 为了更好地支持嵌入式处理器
  • 第八章、Linux 磁盘与文件系统管理

    系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也不能太小 太大会造成磁盘容量的浪费 太小则会产生文件无法储存的困扰 此外 我们在前面几章谈到的文件权限与属性中 这些权限与属性分别记录在文件系统的哪个区块内 这就得
  • 贝叶斯网络学习

    状态空间搜索 如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程 通俗点说 两点之间求一线路 这两点是求解的开始和问题的结果 而这一线路不一定是直线 可以是曲折的 由于求解问题的过程中分枝有很多 主要是求解过程
  • 神经网络——实现MNIST数据集的手写数字识别

    由于官网下载手写数字的数据集较慢 因此提供便捷下载地址如下 手写数字的数据集MNIST下载 https download csdn net download gaoyu1253401563 10891997 数据集包含如下 一 使用小规模数
  • 超级简单!vue解决前后端跨域问题,看完就会

    在Vue中解决前后端跨域问题 需要通过配置和设置代理来实现 配置 在Vue的config目录下的index js文件中 找到devServer选项 在其中添加如下代码 devServer proxy api target http loca
  • mysql my-innodb-heavy-4g.cnf_my-innodb-heavy-4G.cnf 配置文件

    client 客户端配置 port 3306 mysql连接时默认的端口号 socket tmp mysql sock 用于连接mysql mysqld 服务端配置 port 3306 mysql服务默认监听的端口 socket tmp m
  • window opengl

    接口 https www khronos org registry OpenGL api GL
  • 一文吃透KMP算法

    前提 假设我们在字符串 bacbababaabababca 中 搜寻字符串 abababca 是否存在 KMP算法过程 下面就KMP算法的匹配过程进行阐述 step0 在执行匹配之前 先定义几个概念 前缀集合 后缀集合 部分匹配值 前缀集合
  • 天梯题集——紧急救援(Dijkstra+倒序打印分析)

    Dijkstra算法 用于求单源到其他点的最短路径 紧急救援 该题与 Dijkstra模板题 的不同之处在于该题需要记录更多信息 主要思路从局部最优到整体最优 类似dp的思想 include
  • 函数指针的使用

    函数指针的初始化 调用方式 include