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

回调函数(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;
}

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

相关文章:

  • JavaSec 之 SQL 注入简单了解
  • 利用PaddleNLP进行文本数据脱敏
  • 前后端延迟怎么解决
  • 汽车信息安全--S32K3的HSE如何与App Core通信(1)?
  • 稀疏计算、彩票假说、MoE、SparseGPT
  • 第2.1章 StarRocks表设计——概述
  • SOCKS5、代理 IP、HTTP 在软件工程中的应用
  • CrossOver虚拟机软件2024有哪些功能?最新版本支持哪些游戏?
  • Qt(C++)面试题 | 精选25项常问
  • 推理任务稳定提点大揭秘:力大砖飞背后的科学
  • 照片上多余的人怎么处理?这几种方法让你的照片更完美!
  • 子网络划分与互通,上网行为审计
  • Nginx返回502错误提示问题原因常用解决方法
  • NLP_BERT与GPT争锋
  • 2024年交通与运输工程、供应链管理国际会议(ICTESCM2024)
  • Android 架构优化~MVP 架构改造
  • angular2开源库收集
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Elasticsearch 参考指南(升级前重新索引)
  • HashMap剖析之内部结构
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JAVA_NIO系列——Channel和Buffer详解
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • MySQL数据库运维之数据恢复
  • 从伪并行的 Python 多线程说起
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 人脸识别最新开发经验demo
  • 如何在GitHub上创建个人博客
  • 微信小程序:实现悬浮返回和分享按钮
  • 优化 Vue 项目编译文件大小
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Mac 上flink的安装与启动
  • 阿里云ACE认证学习知识点梳理
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 安徽锐锋科技IDMS系统简介
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #考研#计算机文化知识1(局域网及网络互联)
  • (1)(1.13) SiK无线电高级配置(六)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (33)STM32——485实验笔记
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • *** 2003
  • *Django中的Ajax 纯js的书写样式1
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 无限分类
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET实现之(自动更新)
  • .net下的富文本编辑器FCKeditor的配置方法