您的位置:首页 > 其它

什么是回调函数?回调函数的简单实现。

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时,就对原数组的元素分别加一,结果如图:
                                                             
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 基础知识 c