前言:
对函数指针与回调函数知识回顾,仅供学习参考...
目录
前言:
1.0 函数指针
2.0 函数指针变量
3.0 函数指针与指针函数
4.0 函数指针类型
5.0 卡点
后记:
1.0 函数指针
函数指针,简单来说就是指向函数的指针,为什么要使用函数指针?
我们编写的上层应用代码毫无疑问会调用下层的库代码,包括标准库、单片机或者GUI的库,
像printf()、malloc()等等,通常调用流程是:
在某些场景,调用流程要反过来,比如使用下层库里的定时功能,每隔1S,即时通知上
层的业务去刷新时钟的UI界面,如何通知?很多库代码是闭源的,我们不可能在库中添
加业务代码函数,也就没办法直接调用,但是C语言提供了函数指针和回调函数机制通过
实现下层通知上层的功能。
2.0 函数指针变量
函数返回值类型(* 函数指针变量名)(函数参数列表);
int32_t (*pSum)(int32 t a, int32 t b);
这条语句定义了一个名为 pSum
的指针,它指向一个函数,该函数接收两个 int32_t
类型的参数,并返回一个 int32_t
类型的结果
函数的数据类型,可以描述为 int32_t (*)(int32_t, int32_t)。这表示任何具有这种签名(即接受两个 int32_t 参数并返回 int32_t)的函数都可以赋值给 pSum。
函数指针变量pSum,就像int32t*ptr里的ptr一样,函数名称就像数组名称一样保存了函数地址:
(*pSum)(1,2),表示间接访问并调用Sum函数
int32_t Sum(int32_t x, int32_t y)
{return x + y;
}int main(void)
{// 创建函数指针变量int32_t (*pSum)(int32_t a, int32_t b);// 将函数的地址赋值给函数指针变量pSum = Sum;// 打印输出函数与函数指针地址printf("pSum = 0x%p , Sum = 0x%p\n",pSum, Sum);// 调用函数int32_t sum = (*pSum)(1, 2);printf("%d\n",Sum);return 0;
}
运行以上程序输出如下结果:
3.0 函数指针与指针函数
int32 t(*psum)(int32 t a, int32 t b);为什么(*psum)要使用()?
如果不使用(),变成了int32 t *pSum(int32 ta, int32 tb);基于运算符优先级,pSum先结合()再结合*,这种格式被称为指针函数,表示返回值为指针类型的函数比如常见的:
void *malloc(size t size)
char *strcpy(char *dest, const char *src)
使用(),基于运算符优先级,pSum先结合*再结合后面的(),这种格式用来定义函数指针变量,变量是pSum.
函数指针
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>int32_t Sum(int32_t x, int32_t y)
{return x + y;
}void Handle(int32_t (*pSum)(int32_t a, int32_t b))
{int32_t sum = (*pSum)(1, 2);printf("%d\n",sum);
}int main(void)
{Handle(Sum);return 0;
}
运行以上程序输出如下结果:
4.0 函数指针类型
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>typedef int32_t (*pSum)(int32_t a, int32_t b);int32_t Sum(int32_t x, int32_t y)
{return x + y;
}void Handle(pSum psum)
{int32_t sum = psum(1, 2);printf("%d\n",sum);
}int main(void)
{Handle(Sum);return 0;
}
运行以上程序输出如下结果:
typedef int32_t (*PFUNC)(int32 t a, int32 t b);
5.0 卡点
typedef int32_t (*pSum)(int32_t a, int32_t b);
- typedef 关键字用于创建一个新的类型别名,
- int32_t(*psum)(int32_t a,int32t b)定义了一个函数指针类型,
- int32_t 是函数的返回类型
- (*pSum)表示 psum 是一个指向函数的指针
- (int32_ta,int32tb)是该函数接受的参数列表
通过 typedef,你创建了一个新的类型别名 pSum,这个别名代表一个函数指针类型,该指针指向一个接受两个 int32_t 类型参数并返回一个 int32_t 类型值的函数。
pSum 本身不是一个指针变量,而是一个函数指针类型。你可以使用 pSum 类型来声明函数指针变量。
pSum myFunctionPointer;
这里的 myFunctionPointer 是一个函数指针变量,它的类型是 pSum,也就是说:myFunctionPointer 可以指向一个接受两个 int32_t 类型参数并返回一个 int32_t 类型值的函数
后记:
本人对相关知识回顾与思考,仅供学习参考...