您的位置:首页 > 其它

关于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 语言