回调函数这个是什么鬼?
这是一个同学在微信给我提问的问题。
要搞清楚回调函数,我们首先要搞清楚函数,函数其实就是一个地址,这个地址描述了这个函数在内存中的位置。
但是函数和变量也是一样的,有类型,对变量来说,变量会分成各种类型,对函数来说也是一样,函数会有参数和返回值,不同的参数和返回值就描述了不同的函数。
那回调函数呢?
回调函数其实是一个连锁反应,比如你小孩生病了,这会导致你老婆可能不开心,你老婆不开心了,会连锁反应到你也会不开心。
不开心这个信心从你老婆传递到了你身上,你小孩就起到了函数调用的作用。
我们可以写个简单的代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>void func(void *f(int),int parm)
{f(parm);
}void call_back(int parm)
{printf("%s(),LINE=%d,args=%d\n",__FUNCTION__,__LINE__,parm);
}int main(void)
{func(call_back,123);return 0;
}
代码运行
$main
call_back(),LINE=12,args=123
从项目角度上看,callback是一个人实现,然后func里面会是另一个人实现,我们在main里面会把回调的指针注册给func,等某个时机成熟的时候,func就会调用这个指针来做它想做的事情。
但是从C语言和计算机角度出发,函数无非就是一个地址,我们传递的是一个地址,后面我们只是用了这个地址来做了我们想做的事情。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>typedef void (*type_func)(int);void func(u_int64_t* ptr,int parm)
{((type_func)ptr)(parm);
}void call_back(int parm)
{printf("%s(),LINE=%d,args=%d\n",__FUNCTION__,__LINE__,parm);
}int main(void)
{func((u_int64_t*)call_back,123);return 0;
}
这段代码里面的信息就会比较多了,一个是用了typedef来修饰一个函数指针的类型,然后我们在传call_back的时候,强制让它变成了一个地址,之后拿到这个地址后,再让它变成一个函数。
写这个demo的意思就是想让大家知道,函数名,其实不过是一个地址,但是,地址只是单纯的地址,没有多的含义,所以我们需要给地址加上类型,这才是有意义的。
一个人是没有意义的,一个人做的事情,才会让这个人的人生有意义。
$gcc -o main *.c -lm
$main
call_back(),LINE=14,args=123
最后,如果觉得不错,大家顺手点个赞,转发就是对我最大的鼓励和支持!
长按识别二维码关注公众号
回调函数这个是什么鬼?相关推荐
- c语言timer linux 回调函数_C语言回调函数详解
1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...
- c语言 is函数,关于C语言回调函数的详解~
原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...
- C 语言回调函数详解
1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?网络上众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B ...
- Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]
1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...
- OpenCV(六)形态学操作1--基础:膨胀与腐蚀(回调函数)
目录 形态学通用API:morphologyEx 一.基础理论 1.邻接关系 (1)四邻接: (2)D邻接: (3) 八邻接: 2.连通性 (1)四连通: (2)八连通: (3)m连通: 3.形态学基 ...
- 函数指针--Nginx和Redis中两种回调函数写法
1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...
- 回调函数在C/C++中的使用
回调函数就是一个通过函数指针调用的函数.假如把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么就是回调机制.A函数就是回调函数,而通常情况下,A函数是在系统符合 ...
- 【FFmpeg】自定义回调函数处理AVIOContext中的数据
1.简述 AVIOContext是FFmpeg管理输入输出数据的结构体,它的成员变量有指向数据的指针.大小以及处理数据的回调函数指针等等.如果使用avio_open或avio_open2来创建,它会根 ...
- php 回调递归,PHP数组函数 array_walk_recursive (使用回调函数递归遍历数组元素)
在PHP中,数组函数 array_walk_recursive () 使用回调函数递归遍历数组元素. 函数语法:array_walk_recursive ( array &$array , c ...
最新文章
- 完整年份值必须介于_上 | 完整解释 Monad 程序员范畴论入门
- css 菜单栏悬停_在CSS中构建悬停菜单
- 重温1 Android系统架构及版本
- java带权连通图上最小权边,连通图最小生成树的算法及实现
- RabbitMQ 构建高可靠集群架构
- python绝对导入_[编程基础] Python中的绝对导入与相对导入
- 删除虚拟环境_手把手教你在Linux系统下使用Python虚拟环境
- collector_使用Data Collector监视SQL Server性能
- PHP发送邮件,解决乱码
- 第 8 章 crontab
- 拓端tecdat|R语言t检验和非正态性的鲁棒性
- Python使用scrapy框架编写自动爬虫爬取京东商品信息并写入数据库
- 有哪些值得推荐的PS(Adobe Photoshop)插件?
- 【Yolov5】1.认真总结6000字Yolov5保姆级教程(2022.06.28全新版本v6.1)
- ORACLE基础之oracle锁(oracle lock mode)详解
- UI设计师如何通过兼职月入过万?
- quartz mysql死锁问题_Quartz 并发
- 其实很简单 QQ被盗了可以这样找回来(转)
- 线性代数可以做些什么?(之一)
- Crackme之Acid burn.exe