搞清楚函数指针与回调函数那些东西

本文介绍了函数指针的基本概念,它是指向函数的指针变量,允许灵活调用不同功能的函数。接着讲解了typedef在定义函数指针中的应用,帮助理解复杂写法。最后探讨了回调函数的原理,即把函数指针作为参数传递给其他函数,实现灵活的功能扩展。回调函数的正确使用需要注意函数类型匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本的定义解释:

函数指针是指向函数的指针变量。通过函数指针C语言可以实现各种强大的功能与设计方法。

回调函数是作为参数传递给另一个函数的函数。接受回调作为参数的函数预计会在某个时间点执行它。回调机制允许下层软件层调用上层软件层定义的函数。

一、函数指针

函数指针,顾名思义它就是一个指针,只不过它是一个函数指针,所以指向的是一个函数。类比一般的变量指针,指针变量,实质上是一个变量,只不过这个变量存放的是一个地址,在32位单片机中,任何类型的指针变量都存放的是一个大小为4字节的地址。

举个例子理解和平时的指针的区别:

int a;    int func(void){return 0};

int *p;   int (*pfunc)(void){return 0};

p = &a;    pfunc = &func;

左边走义变量a,右边定义函数func;

左边定义int指针,右边定义pfunc;

左边赋值指针,右边赋值函数指针;

指向函数的指针被称作是函数指针。通过函数指针,我们可以灵活的调用各种形式相同,但是功能不同的函数这样做大大的增加了代码的灵活程度。

二、typedef 函数指针

我们定义一个函数指针时常用的写法:

int (*pfunc)(int,int*,void*);

这样也非常的好理解,但是也会见到另一种写法,刚开始根据常识去理解它非常困难,比如以下的这种写法: 

typedef int (*pfunc)(int,int*,void*);

刚开始肯定会有点懵,因为我们一般用的typedef用法是:

typedef 原类型 别名

所以在分析这种形式的定义的时候可以这样看:先去掉typedef和别名, 剩下的就是原变量的类型。去掉typedef和pfunc以后就剩:int(*)(int,int*,void*)

也就是要定义的类型是int(*)(int,int*,void*),别名是pfunc。这一点对于理解typedef定义函数指针非常重要,先记下来。

、回调函数

回调函数说白了就是将函数指针作为函数的参数,这样就有了回调函数。比如:

int callfunc(int (*pfunc)(int,int*,void*),int,int*,void*)
{
    return pfunc(int,int*,void*);
}

        在这个函数当中,通过该函数指针调用的函数被称为回调函数。这种开发方式的用途非常广泛。具体来说,在回调函数的应用场景当中,会出现两个角色。分别是某功能函数的开发者以及该功能函数的使用者。callfunc函数就是开发者写的函数,写库和底层的那一类人写的函数,我们每一个单片机的使用者,需要写出各种各样的具体的功能函数,只要我们写得功能函数的形参和返回值和函数指针的类型相同就可以了。

        这里要注意的是我们使用者写的函数的类型一定要于开发者写的回调函数类型一样,比如形参和返回值的类型要一样。不然肯定不能调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值