回调函数(Language C)

#源于指针的深入学习

对于回调函数,其实我们只需要了解一下函数指针即可使用回调函数了

什么是回调函数?

通俗的来讲,它是一个函数指针变量(注意:它不是指针函数,它们是不同的一个概念)

函数指针---指针存储着一个函数的地址

指针函数---该函数的返回值是指针类型

为何要使用函数指针?

其实在企业级项目开发中,开发为了避免代码壅余,以及封装细节,多重调用,日常维护中减轻运维的所需要的时间金钱成本;从而大量的使用回调函数作为别的函数的参数---怎么创建出这个神奇的回调函数呢?也就是我们说的函数指针。

怎么创建函数指针&如何使用?

首先,我们需要知道,指针存储地址时,往往获取变量的首地址。那么该如何获得函数的首地址呢

  1. 函数名---其实就是地址
  2. 函数名就是该函数所占内存的首地址

那么我们就可以直接把函数地址以函数名的方式存储在指针中

写法:

函数返回类型(*变量名)(参数类型与个数) = 我们想要的那个函数的函数名

例如:

1.无返回类型且无参数的函数指针创建.

void printstr(){printf("Hello,World");
}void (*p)() = printstr;/*分析:在此处,我定义的函数printstr并无返回值
所以函数指针的创建时,它也是void; 并且该函数并未
有接收的参数;所以p变量旁边的()也是空的*/

 2.有返回值且有参数的函数指针创建.

int better(int a,int b):return (a > b) ? 1 : 0 
//此为三目运算 如果a > b 成立则返回 1 否则为 0//创建函数指针
int (*c)(int,int) = better/*注意,此处函数指针前面的返回类型 是与函数一致的
参数个数与原函数(better)一致,唯一不同的是,我们只需要
写出参数的类型,无需具体的参数名

又如这个:

#include <stdio.h>
void f1() {printf("hello,world");
}int main() {void (*p)(); //定义函数指针 p = f1; //函数名就是首地址--->传地址了p(); //通过函数指针调用函数 等价于 f1()int (*a)(int, int) = add;//告诉有几个形参,类型printf("%d\n", a(1, 2));return 0;
}

那么,我们进阶的来体验一下什么是回调函数

#include <stdio.h>int less(int x,int y){return ( x < y ) ? 1 : 0;
}int greater(int x, int y) {return ( x > y ) ? 1 : 0;
}//回调函数:把函数名作为另一个函数的参数
//作用修改:修改函数的功能void sort(int *a,int len,int (*p)(int,int)) {int i,j;for (i = 0; i < len - 1; i++) {for ( j = 0; j < len - i - 1; j++) {//if (a[j] > a[j+1]) { 原先的判别if (p(a[j],a[j+1])) { //通过函数指针调用函数int num = a[j];a[j] = a[j+1];a[j + 1] = num;}}}}int main() {int a[10] = {0}; //创建整数数组
/*其实在使用中,指针与数组是相同的,所以我们在参数设置的为指针
传入的时候可以用 数组名 int i;for ( i = 0; i < 10; i++) {scanf("%d",a[i]);}sort(a,10,greater); //只需要修改这里传入的函数for ( i = 0; i < 10; i++) {printf("%d",a[i]);}
//打印出排序后的数组printf("\n");return 0;
}

请观看的时候,一个个的实现一下,会对我们的理解更有帮助

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

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

相关文章

靡语IT:JavaScript_概述、基础

一、JavaScript 概述 javaScript 语言主要是完成页面的数据验证&#xff0c;因此它运行在客户端&#xff0c; 需要运行浏览器来解析执行 JavaScript 代码。js 是网景公司 &#xff08;Netscape&#xff09;的产品&#xff0c;最早取名为 LiveScript 最后借 java 的热度 改为 j…

C++多线程同步(上)

多线程同步 引言总述详情互斥锁示例运行结果分析条件变量示例一实现分析优化运行结果示例二实现代码运行结果示例三实现代码运行结果读写锁示例实现代码注意分析运行结果附言实现运行结果运行结果个人心得引言 项目中使用多线程,会遇到两种问题,一种是对共享资源的访问时需要…

关于运行flutter app 运行到模拟器出现异常提示

Exception: Gradle task assembleDebug failed with exit code 1 解决方案&#xff1a; 1.讲当前文件的distributionUrl值改为 https://mirrors.cloud.tencent.com/gradle/gradle-7.4-all.zip

Redis 学习笔记 3:黑马点评

Redis 学习笔记 3&#xff1a;黑马点评 准备工作 需要先导入项目相关资源&#xff1a; 数据库文件 hmdp.sql后端代码 hm-dianping.zip包括前端代码的 Nginx 启动后端代码和 Nginx。 短信登录 发送验证码 PostMapping("code") public Result sendCode(RequestP…

超市售货|超市售货管理小程序|基于微信小程序的超市售货管理系统设计与实现(源码+数据库+文档)

超市售货管理小程序目录 目录 基于微信小程序的超市售货管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;商品管理 &#xff08;2&#xff09;出入库管理 &#xff08;3&#xff09;公告管理 …

CrossOver2024虚拟机软件的优缺点分别是什么?

CrossOver虚拟机软件的优缺点分别如下&#xff1a; 优点&#xff1a; 无需双系统&#xff1a;用户可以在Mac或Linux系统上直接运行Windows应用程序&#xff0c;无需安装双系统&#xff0c;从而节省了硬盘空间并避免了系统切换的麻烦。易于安装和使用&#xff1a;CrossOver具有…

文件上传---->生僻字解析漏洞

现在的现实生活中&#xff0c;存在文件上传的点&#xff0c;基本上都是白名单判断&#xff08;很少黑名单了&#xff09; 对于白名单&#xff0c;我们有截断&#xff0c;图片马&#xff0c;二次渲染&#xff0c;服务器解析漏洞这些&#xff0c;于是今天我就来补充一种在upload…

RAW 编程接口 TCP 简介

一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数&#xff0c;一般在 main函数的无限循环中调用&#xff0c;主要功能是为 LwIP各个模块提供…

web前端安全性——JSONP劫持

1、JSONP概念 JSONP(JSON with Padding)是JSON的一种“使用模式”&#xff0c;可用于解决主流浏览器的跨域数据访问的问题。由于同源策略&#xff0c;协议IP端口有任意不同都会导致请求跨域&#xff0c;而HTML的script元素是一个例外。利用script元素的这个开放策略&#xff0…

vscode【报错】yarn : 无法将“yarn”项识别为 cmdlet

问题 CMD下载完yarn可以查看到yarn版本&#xff0c;但是进入到vscode控制台报错无法识别&#xff0c;报错内容如下&#xff1a; vscode【报错】yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff…

@ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)

代码随想录算法训练营第8周&#xff08;C语言&#xff09;|Day57&#xff08;动态规划&#xff09; Day53、动态规划&#xff08;● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划 &#xff09; 1143.最长公共子序列 题目描述 给定两个字符串 text1 …

C#面:i++ 和 ++i 的区别

i 先参与左边的运算&#xff0c;之后 i 自增&#xff1b; int i 5; int result i; // result的值为5&#xff0c;i的值变为6 i i 先自增&#xff0c;之后的值&#xff0c;参与左边的运算&#xff1b; int i 5; int result i; // result的值为6&#xff0c;i的值也为6…

【一步步由简入深,搞定FFT,持续更新中...】

作为一个倾向于形象思维的工程师&#xff0c;总想把复杂深奥的知识搞的方便理解&#xff0c;虽然上学时学过数字信号处理&#xff0c;仍然一知半解&#xff0c;现在想借着项目中涉及到的频谱相关知识总结下来&#xff0c;在了解中逐步完善。 好了&#xff0c;首先要明确的概念是…

ffmpeg for android编译全过程与遇到的问题

编译前准备 编译环境&#xff1a;Ubuntu16&#xff0c;可自行下载VMWare最新版并百度永久许可证或在服务器上安装Ubuntu ffmpeg源码&#xff1a;ffmpeg4.2.2 NDK下载&#xff1a;Android NDK r21e 有条件的最好还是在Liunx平台下编译吧&#xff0c;Windows平台下编译坑更多…

【计算机网络】数据链路层|封装成帧|透明传输|差错检测|PPP协议|CSMA/CD协议

目录 一、思维导图 ​ 二、数据链路层功能概述 1.数据链路层概述 2.数据链路层功能概述——封装成帧 3.数据链路层功能概述——透明传输 4.数据链路层功能概述——差错检测 三、数据链路层重要协议 1.数据链路层重要协议&#xff1a;PPP协议 2.数据链路层重要协议&#x…

js设计模式:备忘录模式

作用: 封装的对象可以在对象触发行为时进行状态的记录与保存 也可以进行状态的回退,恢复之前的状态 示例: class Editor{constructor(){this.allText }edit(text){this.allText text}saveNow(){return new EditorText(this.allText)}backspacing(editorText){this.allText…

护眼台灯哪个品牌更好用?五大好用护眼台灯大爆料!

护眼台灯相信大家都有所耳闻或者使用过,家里有小孩的可能了解更深,毕竟是孩子学习时需要使用的小家电。现在市面上的护眼台灯种类可以说是多到眼花缭乱,甚至有些劣质的产品掺杂在里面,或许有些宝妈已经踩过一些坑了&#xff0c;护眼台灯究竟哪个品牌更好用&#xff1f; &#x…

这个春节,爽了

四次医院 请了一周假&#xff0c;准备开始愉快的长假。 结果第一天小孩就发烧了&#xff0c;赶紧送医院拿药。回到家才发现&#xff0c;给医生看的验血报告是上一次的&#xff0c;那是好几个月之前的。 但是药已经吃了&#xff0c;这是吃错药了呀&#xff01;&#xff01; …

手机中有哪些逆向进化的功能

手机中有哪些逆向进化的功能&#xff1f;逆向进化是指明明很优秀的很方便的功能&#xff0c;却因为成本或者其他工业原因莫名其妙地给取消了。 逆向进化1&#xff1a;可拆卸电池-变为不可拆卸电池。 智能手机为了追求轻薄等原因&#xff0c;所以移除了可拆卸电池功能。将电池…

GoLand 相关

goland 下载依赖 go mod tidy&#xff1a;保持依赖整洁 go mod tidy 命令的作用是清理未使用的依赖&#xff0c;并更新 go.mod 以及 go.sum 文件。 go mod tidy 和 go mod vendor 两个命令是维护项目依赖不可或缺的工具。go mod tidy 确保了项目的 go.mod 文件精简且准确&…