关于C中的回调函数的应用
2010-04-09 16:57
204 查看
在使用回调函数中,往往会设置一个指向函数的指针,那为什么不直接将函数名作为参数传递呢?
原因是:在C语言中函数本身不是变量,但是可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值,
下面是我在网上找到的一个关于回调函数的小例子(对原文的例子有所修改)
原文链接:http://hi.baidu.com/helloweenpad/blog/item/d96d13fb4b2276809f514607.html/cmtid/feb4928edf8883e5f11f3636
#include<stdio.h>
typedef int (*CallBackFun)(char *p);
/*该语句定义了类型CallBackFun是“一个指向函数的指针,该函数具有1个char *类型的参数,返回值的类型为int.”*/
int Afun(char *p) { // 方法 Afun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf("Afun 回调打印出字符%s!/n", p);
return 0;
}
int Cfun(char *p) { // 方法 Bfun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf("Cfun 回调打印:%s, Nice to meet you!/n", p);
return 0;
}
int call(CallBackFun pCallBack, char *p) { // 执行回调函数,方式一:通过命名方式
printf("call 直接打印出字符%s!/n", p);
pCallBack(p);
return 0;
}
int call2(char *p, int (*ptr)(char *p)) { // 执行回调函数,方式二:直接通过方法指针
printf("==============/n", p);
(*ptr)(p);
}
int call3(char *p, CallBackFun pCallBack){ // 执行回调函数,方式一:通过命名方式
printf("--------------/n", p);
pCallBack(p);
}
int main() {
char *p = "hello";
call(Afun, p);
call(Cfun, p);
call2(p, Afun);
call2(p, Cfun);
call3(p, Afun);
call3(p, Cfun);
return 0;
}
在原文中,作者将int call2(char *p, int (*ptr)(char *p))换成了int call2(char *p, int (*ptr)())程序也能运行,我觉得还是使用前者较好,因为这样可以直观地了解到指针ptr指向的函数具有1个char*类型的参数。
原因是:在C语言中函数本身不是变量,但是可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值,
下面是我在网上找到的一个关于回调函数的小例子(对原文的例子有所修改)
原文链接:http://hi.baidu.com/helloweenpad/blog/item/d96d13fb4b2276809f514607.html/cmtid/feb4928edf8883e5f11f3636
#include<stdio.h>
typedef int (*CallBackFun)(char *p);
/*该语句定义了类型CallBackFun是“一个指向函数的指针,该函数具有1个char *类型的参数,返回值的类型为int.”*/
int Afun(char *p) { // 方法 Afun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf("Afun 回调打印出字符%s!/n", p);
return 0;
}
int Cfun(char *p) { // 方法 Bfun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf("Cfun 回调打印:%s, Nice to meet you!/n", p);
return 0;
}
int call(CallBackFun pCallBack, char *p) { // 执行回调函数,方式一:通过命名方式
printf("call 直接打印出字符%s!/n", p);
pCallBack(p);
return 0;
}
int call2(char *p, int (*ptr)(char *p)) { // 执行回调函数,方式二:直接通过方法指针
printf("==============/n", p);
(*ptr)(p);
}
int call3(char *p, CallBackFun pCallBack){ // 执行回调函数,方式一:通过命名方式
printf("--------------/n", p);
pCallBack(p);
}
int main() {
char *p = "hello";
call(Afun, p);
call(Cfun, p);
call2(p, Afun);
call2(p, Cfun);
call3(p, Afun);
call3(p, Cfun);
return 0;
}
在原文中,作者将int call2(char *p, int (*ptr)(char *p))换成了int call2(char *p, int (*ptr)())程序也能运行,我觉得还是使用前者较好,因为这样可以直观地了解到指针ptr指向的函数具有1个char*类型的参数。
相关文章推荐
- 关于回调函数应用的理解以及小例子
- Android 关于接口(interface)回调函数的简单应用
- 一个关于iphone应用邮件功能的问题
- [转]关于ASP.NET(C#)程序中TEXTBOX下动态DIV跟随[AJAX应用]
- 关于Javascript回调函数的一个妙用
- android应用开发全程实录-关于google map的部分章节-漂亮的气泡地图
- 关于JSON以及JSON在PHP中的应用技巧
- 关于GridView中自定义分页、单选、多选、排序、自增列的简单应用
- 关于iOS应用被Metadata Rejected的处理方法
- 关于栈的应用-括号匹配问题的两种解题思路
- iPhone应用中关于NSTimer的一些问题
- 关于回调函数处理DLL里的数据问题
- 我关于 应用的一点想法
- 关于函数模板和类模板的应用
- 关于C#中Linq查询的应用
- TClientDataSet中关于TField、TFieldDef动态创立字段的应用
- 关于Html5发展和应用前景
- 关于enum应用的总结
- 关于self 类的应用
- Android填坑之旅(第一篇) 关于应用文本太长为用户提供复制的功能