函数指针与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);
阅读全文
0 0
- 函数指针与typedef
- 函数指针与typedef
- 函数指针与typedef
- 函数指针与typedef
- typedef与函数指针
- 函数指针与typedef
- 函数指针与typedef
- 函数指针与typedef
- 函数指针与typedef
- 函数指针与typedef
- 函数指针与typedef
- typedef与函数指针
- 函数指针与typedef
- 函数指针与typedef
- typedef 与函数指针
- 函数指针与typedef
- 函数指针与typedef
- 函数指针与typedef
- ext store动态修改url
- Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)
- C++ windows多线程程序到linux下运行失败,多线程无优化效果
- 解决案例:ORA-00205: error in identifying control file, check alert log for more info
- 每日一题——链表合并
- 函数指针与typedef
- Request processing failed; nested exception is java.lang.NullPointerException
- Virtuoso的localhost启动步骤
- unkown the request
- 敷面膜的时候肌肤出现刺痛感,我过敏了吗?
- localStorage使用总结
- String,StirngBuffer和StringBulider类
- gmagick应用笔记
- 5、Shiro+Oracle实现用户授权(Authentication)