C语言回调函数

回调函数:如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,即调用者提供一个函数但自己不去调用它,而是让实现者去调用它,这称为回调函数(Callback Function)。

先理解一下关于指针数组的概念,定义一个指针数组,int *[3] p;这种定义只能从理解上对我们有帮组,但真正的指针数组却不能这么定义,int *p[3];

函数指针,或许我们这么定义从理解上对我们有帮助,void *(void *) func;但在编译器下要必须这么定义才会被编译器识别,void (*func)(void *);

我们来看一个例子:

#include <stdio.h>

int func(int a,int b)

{

if (a>b) 

{

return a;

}

else

{

return b;

}

}

int main(int argc, char* argv[])

{

int iVar=0;

int (*fp)(int a,int b);

fp=&func;

iVar=(*fp)(4,2);

printf("funcation return value:%d\n",iVar);

return 0;

}

改程序实现了一个函数,定义一个函数指针,将实现函数的地址赋给该函数指针,

指针调用跟函数名直接调用从程序的实现上看是很类似,看到这儿可能会有这样的疑问,函数名调用跟函数指针调用一样啊,为什么要用函数指针调用,不是用函数名调用会更方便,指针调用还多了一行的代码?

程序在编译时会给变量,函数等分配内从空间,要是在程序执行时,使用函数名调用的话,程序会在内从中拷贝函数的内容在执行,而函数指针会直接到函数在编译时分配的空间执行代码,所以会在执行效率上有所提高。



回调函数:

此示例由三个文件组成:para_callback.h、para_callback.c、callback.c,三者的代码如下:

/**************************para_callback.h**************************/

#ifndef PARA_CALLBACK_H

#def PARA_CALLBACK_H

//声明一个函数指针类型callback_t,用callback_t声明的变量指向这样的函//数:无返回值,有一个参数,参数类型为空指针类型

typedef void (*callback_t)(void *);

void speak(callback_t, void*);

#endif

/**************************para_callback.c**************************/

#include"para_callback.h"

void speak(callback_t func, void*variable)//这就是下面论述中的“实现者”

{

   func(variable);

}

/****************************callback.c****************************/

#include"para_callback.h"

#include<stdio.h>

void speakint(void* variable)//这就是传说中的回调函数中的一个

{

   printf("%s%d","I am a integer variable: ",*((int*)variable));

}

void speakfloat(void* variable)//这就是传说中的回调函数中的一个

{

   printf("%s%f","I am a float variable: ",*((float*)variable));

}

 

int main()//在本例中,main函数就是下面论述中的“调用者”

{

   int variable_int = 100;

   float variable_float = 100.9;

   speak(speakint, (void*)&variable_int);

   speak(speakfloat, (void*)&variable_float);

}

在本例中speakint,speakfloat为回调函数,有实现者去调用,可回调函数是有参数的,怎么进行传递那,在调用者调用实现者后,实现者去实现回调函数是会给回调函数传一个参数进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值