什么是回调函数?回调函数的简单实现。
2016-08-03 00:49
423 查看
1.概念
在编写程序的时候,我们通常会在主函数中调用库里的各种函数,这个过程叫做调用,函数在调用的时候通常需要给函数传递一些必要的参数,函数的参数可以是很多的类型,而有的时候系统里的库函数要实现某种功能的时候,需要我们向库函数传递一个函数类型的参数,它才能实现所需达到的功能。这时候的库函数就调用了你编写的函数,这个过程就叫做回调。这时被库函数调用的函数,也就是被当做参数传入的函数就被称为回调函数。而这类库函数一样的函数就可以叫做中间函数,他们调用回调函数的过程就叫做登记回调函数。当然回调函数这种机制并不只存在于程序与库函数之间,中间函数也可以是程序员自己编写的函数。
形象的来讲回调函数就相当于公司给你安排了一项工作(此时这里相当于主函数),但是你发现这项工作你不知从何下手,然后你就在网络上找到了很多的解决方案,你选择了其中一种完成了工作任务。这里的你就是那个中间函数,换句话说就是这些网上找的方案不能完成你的工作,需要你去调用这些方案来完成工作,而你在网络上找的解决方案就是回调函数。
回调函数机制如图:
2.代码实现
#include <stdio.h> void Sub(int *p) { //回调函数,对参数减一 (*p) -= 1; } void Add(int *p) { (*p) += 1; //回调函数,对参数加一 } void option_arr(int arr[], int sz, void(*op)(int *)) //中间函数,遍历数组,并把他们都放入回调函数的参数 { int i = 0; for (i = 0; i<sz; i++) { op(arr + i); } } int main() { //主函数 int i = 0; int arr[] = { 1,2,3,4,5,6,7,8,9 }; int sz = sizeof(arr) / sizeof(arr[0]); option_arr(arr, sz, Sub); //调用中间函数,参数中arr为数组,sz为数组大小,Sub选用的回调函数 for (i = 0; i < sz;i++) { printf("%d ",arr[i]); } system("pause"); return 0; }这里在主函数里给了一个整型数组arr = {1,2,3,4,5,6,7,8,9},还调用了中间函数option_arr()。在主函数外定义两个回调函数,一个是Sub(int *p)使数组里的元素减一,一个是Add(int * p)使数组里的元素加一,此外还定义了中间函数option_arr(int
arr[],int sz,void(*op)(int *))这里的三个参数第一个是数组,第二个是数组的大小,第三个是一个函数指针,它所指的就是要回调的回调函数,所以中间函数的主要功能是遍历数组里的每个元素,并把他们放入回调函数进行操作。
当中间函数里的参数三的回调函数选用Sub时,就对原数组的元素分别减一,结果如图:
当中间函数里的参数三的回调函数选用Add时,就对原数组的元素分别加一,结果如图:
相关文章推荐
- Linux C函数参考手册(PDF版)
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- 非常不错的脚本入侵基础知识总结第1/2页
- AS3 Flex基础知识100条
- Ruby基础知识之方法、代码段
- 关于C#中排序函数的总结
- C# partial关键字说明
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua教程(十七):C API简介
- Lua实现split函数