函数指针与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);

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值