基本的定义解释:
函数指针是指向函数的指针变量。通过函数指针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函数就是开发者写的函数,写库和底层的那一类人写的函数,我们每一个单片机的使用者,需要写出各种各样的具体的功能函数,只要我们写得功能函数的形参和返回值和函数指针的类型相同就可以了。
这里要注意的是我们使用者写的函数的类型一定要于开发者写的回调函数类型一样,比如形参和返回值的类型要一样。不然肯定不能调用的。