【回调函数】

1.回调函数是什么?

回调函数就是⼀个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数当这个指针被用来调用其所指向的函数
时,被调用的函数就是
回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发⽣时由另外的⼀方调用的,用于对该事件或条件进⾏响应。
只有调⽤函数的逻辑是有差异的,我们可以把调⽤的函数的地址以参数的形式传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能。

接下来是一个简易计算器(利用回调函数)

#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}void calc(int(*pf)(int, int))
{int x, y;int ret = 0;printf("输入操作数:");scanf("%d %d", &x, &y);ret = pf(x, y);printf("ret = %d\n", ret);
}int main()
{int input = 1;do{printf("*************************\n");printf("  1:add           2:sub  \n");printf("  3:mul           4:div  \n");printf("********0. exit *********\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(add);break;case 2:calc(sub);break;case 3:calc(mul);break;case 4:calc(div);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

图 

下面是改造后的方法(利用数组函数进行优化,方便,减少冗余)

//加法
int add(int a, int b)
{return a + b;
}
//减法
int sub(int a, int b)
{return a - b;
}
//乘法
int mul(int a, int b)
{return a * b;
}
//除法
int div(int a, int b)
{return a / b;
}
//菜单
void menu()
{printf("*****************************\n");printf("********1.add   2.sub********\n");printf("********3.mul   4.div********\n");printf("********   0.exit  **********\n");printf("*****************************\n");
}
int main()
{int* (*pfArr[])(int, int) = {NULL,add ,sub,mul,div};//函数指针数组,存放函数int input = 0;int x = 0;int y = 0;int ret = 0;do {menu();printf("请选择");scanf("%d", &input);if (input >= 1 && input <= 4) {printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = pfArr[input](x, y);//这里进行调用函数数组里面的函数printf("%d\n",ret);}else if(input==0){printf("退出\n");}else {printf("选择错误,重新选择");}} while (input);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PL理论】(12) F#:模块 | 命名空间 | 异常处理 | 内置异常 |:? | 相互递归函数

&#x1f4ad; 写在前面&#xff1a;本章我们将介绍 F# 的模块&#xff0c;我们前几章讲的列表、集合和映射都是模块。然后我们将介绍 F# 中的异常&#xff0c;以及内置异常&#xff0c;最后再讲解一下相互递归函数。 目录 0x00 F# 模块&#xff08;Module&#xff09; 0x01…

Bootstrap框架集成ECharts教程

最新公司项目要在原有的基础上增加一些饼状图和柱状图来统计一些数据给客户&#xff0c;下面就是集成的一个过程&#xff0c;还是很简单的&#xff0c;分为以下几步 1、引入ECharts的包 2、通过ECharts官网或者菜鸟教程直接拿示例代码过来修修改改直接用就可以了 注意&#xf…

Windows关闭自动更新最有效的方法

按WR打开电脑命令框输入“regedit”进入注册表 依次点击以下几个 右击新建一个“DWORD(32位)值”&#xff0c;命名为”FlightSettingsMaxPauseDays“ 右边选择十进制&#xff0c;左边填写暂停更新的天数 打开windows更新&#xff0c;进入高级选项 选择暂停更新的天数&#xff…

Fortigate防火墙二层接口的几种实现方式

初始配置 FortiGate出厂配置默认地址为192.168.1.99&#xff08;MGMT接口&#xff09;&#xff0c;可以通过https的方式进行web管理&#xff08;默认用户名admin&#xff0c;密码为空&#xff09;&#xff0c;不同型号设备用于管理的接口略有不同。 console接口的配置 防火墙…

4_1 Linux Centos7的RPM相关知识

4_1 Linux Centos7的RPM相关知识 文章目录 4_1 Linux Centos7的RPM相关知识1. RPM包文件名特征2. RPM软件包管理3. RPM包的一般安装位置4. RPM基本命令5. yum 系统环境centos7.9 临时挂载光盘文件&#xff1a;mount /dev/cdrom /dvd 1. RPM包文件名特征 * 软件名-版本信息.操作…

linux dtb解析方法之验证修改的dts是否有效

我们在调试linux系统外设的时候&#xff0c;经常修改dts文件&#xff0c;那怎么check修改是否生效呢 一、板载设备树路径 linux系统烧录完&#xff0c;登录系统后我们通常能看到如下的fdt和设备树文件&#xff1a; ls /sys/firmware/ devicetree fdt 二、解析板载设备树 那如…

oracle表锁

--oracle提醒记录被另一个用户锁住&#xff1a; --问题描述&#xff1a;你去修改数据时&#xff0c;报错“ --问题分析&#xff1a;你用select t.*,t.rowid from qxt_logsend_0728修改数据结果集时&#xff0c;计oracle会通过事务锁锁住这个记录&#xff0c;点击记录改变&#…

TypeScript常见面试题第十一节

题目五十一:什么是TypeScript映射文件? 一、讲解视频 TS面试题五十一:什么是TypeScript映射文件? 二、题目解析 本题目考察 ts 编译调试的基础内容,ts 的源映射文件通过编译选项–sourceMap 进行生成,指定后编译完了会自动生成对应映射文件,可以用于调试 ts 文件。 三…

java并发控制(猴子摘桃例子)

【问题】 有n个桃子&#xff0c; 猴子A每次固定摘2个&#xff0c;猴子B每次固定摘3个&#xff0c;这2只猴子不断摘桃子直到剩余桃子数量不足以摘&#xff08;必须满足摘桃个数&#xff09;&#xff1b; 【1】 使用AtomicInteger&#xff08;推荐&#xff09; 1&#xff09;利…

Blender导出FBX模型到Unity

Blender设计生成了模型之后&#xff0c;要导入到Unity中使用&#xff0c;我们可以采用FBX格式&#xff0c;但是因为Blender和Unity采用的坐标系不同&#xff0c;Blender是-Y轴向前&#xff0c;Z轴向上&#xff0c;而Unity是Z轴向前&#xff0c;Y轴向上。如果直接导出&#xff0…

iOS--block再学习

block再学习 什么是blockblock是带有自动变量的匿名函数block语法 block的实现block的实质截获自动变量__blcok说明符Block存储域__block变量存储域使用__block变量用结构体成员变量__forwarding的原因 截获对象 什么是block Block时c语言的扩充功能&#xff0c;它允许开发者定…

pytorch之猫狗识别项目

1. 导入资源包 资源包&#xff1a; import torchvision&#xff1a;PyTorch 提供的视觉库&#xff0c;包含了常用的计算机视觉模型架构、数据集以及图像转换工具。 from torchvision import datasets, models&#xff1a;导入 torchvision 中的 datasets 和 models 模块&#…

步态控制之捕获点(Capture Point,CP)

捕获点(Capture Point,CP) 捕获点(Capture Point,CP)是机器人学中的一个重要概念,用于评估和控制机器人步态的稳定性。捕获点表示机器人需要踏出的下一步位置,以确保在动态条件下的稳定性。它特别适用于步态控制和动态行走控制。 应用捕获点进行步态控制 捕获点在步…

python 列出面板数据所有变量名

在Python中&#xff0c;处理面板数据&#xff08;Panel Data&#xff09;通常使用pandas库&#xff0c;特别是当数据以DataFrame或Panel&#xff08;尽管Panel在较新版本的pandas中已被弃用&#xff09;的形式存在时。然而&#xff0c;由于Panel的弃用&#xff0c;现代做法通常…

Docker日志相关命令

日志详情 --details docker logs 默认就是 --details docker logs --details 容器id docker logs 容器id最后n行日志 -n --tail –tail 是 Docker Logs 命令的一个选项&#xff0c;用于限制显示容器日志的行数。通过指定 --tail 后面的数字参数&#xff0c;你可以只显示最后…

spring boot +Scheduled 动态定时任务配置

通常情况下我们设定的定时任务都是固定的,有时候需要我们动态的配置定时任务,下面看代码 import com.mybatisflex.core.query.QueryWrapper; import com.yzsec.dsg.web.modules.exportpwd.entity.ExportPwd; import com.yzsec.dsg.web.modules.exportpwd.entity.table.Export…

如何使用GPT-4o函数调用构建一个实时应用程序?

本教程介绍了如何使用OpenAI最新的LLM GPT-4o通过函数调用将实时数据引入LLM。 我们在LLM函数调用指南(详见https://thenewstack.io/a-comprehensive-guide-to-function-calling-in-llms/)中讨论了如何将实时数据引入聊天机器人和代理。现在&#xff0c;我们将通过将来自Fligh…

bat脚本简介

一、bat脚本 概念定义 BAT 批处理是一种在 Windows 系统中用于将一系列命令组合成一个可执行文件&#xff08;.bat 文件&#xff09;的脚本技术。 允许用户将多个操作命令按顺序编写在一起。形成一个自动化执行的流程。批处理文件可以包含各种系统命令和程序调用。 如文件操作…

中国现在最厉害的书法家颜廷利:东方伟大思想家哲学家教育家

中国书法界名人颜廷利教授&#xff0c;一位在21世纪东方哲学、科学界及当代中国教育领域内具有深远影响力的泰斗级人物&#xff0c;不仅以其深厚的国学修为和对易经姓名学的独到见解著称&#xff0c;还因其选择在济南市历城区的龙泉大街以及天桥区的凤凰山庄与泉星小区等地设立…

如何在隔离环境中设置 LocalAI 以实现 GPU 驱动的文本嵌入

作者&#xff1a;来自 Elastic Valeriy Khakhutskyy 你是否想在 Elasticsearch 向量数据库之上构建 RAG 应用程序&#xff1f;你是否需要对大量数据使用语义搜索&#xff1f;你是否需要在隔离环境中本地运行&#xff1f;本文将向你展示如何操作。 Elasticsearch 提供了多种方法…