函数指针与typedef

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

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值