这是一个同学在微信给我提问的问题。

要搞清楚回调函数,我们首先要搞清楚函数,函数其实就是一个地址,这个地址描述了这个函数在内存中的位置。

但是函数和变量也是一样的,有类型,对变量来说,变量会分成各种类型,对函数来说也是一样,函数会有参数和返回值,不同的参数和返回值就描述了不同的函数。

那回调函数呢?

回调函数其实是一个连锁反应,比如你小孩生病了,这会导致你老婆可能不开心,你老婆不开心了,会连锁反应到你也会不开心。

不开心这个信心从你老婆传递到了你身上,你小孩就起到了函数调用的作用。

我们可以写个简单的代码

#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

最后,如果觉得不错,大家顺手点个赞,转发就是对我最大的鼓励和支持!

长按识别二维码关注公众号

回调函数这个是什么鬼?相关推荐

  1. c语言timer linux 回调函数_C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  2. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

  3. C 语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?网络上众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B ...

  4. Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]

    1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...

  5. OpenCV(六)形态学操作1--基础:膨胀与腐蚀(回调函数)

    目录 形态学通用API:morphologyEx 一.基础理论 1.邻接关系 (1)四邻接: (2)D邻接: (3) 八邻接: 2.连通性 (1)四连通: (2)八连通: (3)m连通: 3.形态学基 ...

  6. 函数指针--Nginx和Redis中两种回调函数写法

    1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...

  7. 回调函数在C/C++中的使用

    回调函数就是一个通过函数指针调用的函数.假如把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么就是回调机制.A函数就是回调函数,而通常情况下,A函数是在系统符合 ...

  8. 【FFmpeg】自定义回调函数处理AVIOContext中的数据

    1.简述 AVIOContext是FFmpeg管理输入输出数据的结构体,它的成员变量有指向数据的指针.大小以及处理数据的回调函数指针等等.如果使用avio_open或avio_open2来创建,它会根 ...

  9. php 回调递归,PHP数组函数 array_walk_recursive (使用回调函数递归遍历数组元素)

    在PHP中,数组函数 array_walk_recursive () 使用回调函数递归遍历数组元素. 函数语法:array_walk_recursive ( array &$array , c ...

最新文章

  1. 完整年份值必须介于_上 | 完整解释 Monad 程序员范畴论入门
  2. css 菜单栏悬停_在CSS中构建悬停菜单
  3. 重温1 Android系统架构及版本
  4. java带权连通图上最小权边,连通图最小生成树的算法及实现
  5. RabbitMQ 构建高可靠集群架构
  6. python绝对导入_[编程基础] Python中的绝对导入与相对导入
  7. 删除虚拟环境_手把手教你在Linux系统下使用Python虚拟环境
  8. collector_使用Data Collector监视SQL Server性能
  9. PHP发送邮件,解决乱码
  10. 第 8 章 crontab
  11. 拓端tecdat|R语言t检验和非正态性的鲁棒性
  12. Python使用scrapy框架编写自动爬虫爬取京东商品信息并写入数据库
  13. 有哪些值得推荐的PS(Adobe Photoshop)插件?
  14. 【Yolov5】1.认真总结6000字Yolov5保姆级教程(2022.06.28全新版本v6.1)
  15. ORACLE基础之oracle锁(oracle lock mode)详解
  16. UI设计师如何通过兼职月入过万?
  17. quartz mysql死锁问题_Quartz 并发
  18. 其实很简单 QQ被盗了可以这样找回来(转)
  19. 线性代数可以做些什么?(之一)
  20. Crackme之Acid burn.exe

热门文章

  1. 卡巴斯基:风险无国界 网络安全从业者要与小网民保持一致
  2. 浅谈开发中的MVVM模式及与MVP和MVC的区别
  3. 移动后端支持平台Parse将API由Ruby迁移到Go
  4. 【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ
  5. 线性表顺序表---逆置所有元素
  6. Maven的学习资料收集--(九) 构建SSH项目以及专栏maven
  7. 前端翻译:Activating Browser Modes with Doctype
  8. 关于ttk的使用与安装
  9. oracle ins-30131错误
  10. Flask爱家租房--房屋管理(获取房屋详情)