函数指针与typedef

来源:互联网 发布:mac的python 编辑:程序博客网 时间:2024/06/03 20:32

搬砖的时候,阅读的源码包括很多这样的形式:

typedef void (*evt_notify_fn)(phy_evt_param_t *param, void *arg);evt_notify_fn fn;

可以说是一脸懵逼,于是去查了下C语言的函数指针与typedef。
1. 函数指针

int function(int);int (*p)(int) = &function; //&是可选的int ans = p(25); //调用函数的方法,也可以为(*p)(25) 

函数指针主要用于回调函数,如下例:

/*使用回调函数的目的在于使得链表查找与类型无关;调用者根据自己的类型写比较函数,然后将函数传地址进去*/Node *search_list( Node *node, void const *value,             int (*compare)(void const *, void const *) ){    while( node != NULL ){        if( 0 == compare( &node->value, value ) )            break;        node = node->link;     }    return node;}

2.typedef函数指针

#include<stdio.h>   typedef int (*FP_CALC)(int, int);int add(int a, int b)   {        return a + b;   }   int sub(int a, int b)   {        return a - b;   }   int mul(int a, int b)   {        return a * b;   }   int div(int a, int b)   {        return b? a/b : -1;   }   /*定义一个函数,参数为op,返回一个指针。该指针类型为拥有两个int参数、   返回类型为int 的函数指针。*/  FP_CALC calc_func(char op)   {        switch (op)         {            case '+': return add;//返回函数的地址            case '-': return sub;            case '*': return mul;            case '/': return div;            default:                return NULL;         }        return NULL;   }   int calc(int a, int b, char op)   {        FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址         if (fp)         return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果        else         return -1;   }

3.解决问题

typedef void (*evt_notify_fn)(phy_evt_param_t *param, void *arg);evt_notify_fn fn;

我的理解是evet_notify_fn可以看作一类指针类型,fn只是它的一个实例。
什么指针类型呢?
就是void any_function(phy_evt_param_t *param, void *arg)的指针类型。
也就是说,我可以使:
fn = any_function(phy_evt_param_t *param, void *arg);

原创粉丝点击