函数指针用法
/*
+ 第一行定义了返回类型为char,输入参数为int的指向某个函数的指针,但是只有第一行我们是无法使用这个指针的。
+ 第二行定义了一个返回类型为char,输入参数为int的函数,glFun是函数名,其实可以函数的函数名也是一个指针,函数名指向该函数在内存中的的首地址。
+ 接下来就是将main函数,将函数名赋予指针,也就是把函数地址给了指针,然后调用指针获得返回值。
*/
1 char (*pFun)(int);
2 char glFun(int a){ return 0;}
3 void main()
4 {
char ret;
5 pFun = glFun;
6 ret = (*pFun)(2);
7 }
- 函数名其实是一个地址,每次调用函数也是让程序找到该地址,从而实现跳转。函数指针形式如下所示:
int (*funcPoint)(int a,int b) - 具体使用形式如下所示
int add(int a,int b)
{
return a+b;
}
void main()
{
int a = 1, b = 2, addData = 0;
int (*funcPoint)(int,int); //定义函数指针
funcPoint = add; //将函数地址赋予指针
addData = (*funcPoint)(a,b); //使用函数指针调用函数
printf("%d",addData);
}
typedef int (*funcPoint)(int,int);
int add(int a,int b)
{
return a+b;
}
void main()
{
int a = 1, b = 2, addData = 0;
funcPoint func_point; //定义函数指针
func_point = add; //将函数地址赋予指针
addData = (*func_point)(a,b); //使用函数指针调用函数
printf("%d",addData);
}
- 函数指针数组,有一系列的函数指针组合形成的数组,具体形式代码所示
char* someFunction(int a,char b)
{
...
}
char* (*funcPoint_arr[3])(int,char); //函数指针数组
...
funcPoint_arr[0] = function1;
funcPoint_arr[1] = function2;
funcPoint_arr[2] = function3;
函数指针主要作用
- 作为回调函数,降低模块与模块之间的耦合度;
比如A模块是底层驱动,B模块是上层应用,当驱动需要上层模块发送相关,信息来进行下一步时,为防止在B模块中直接实现与底层驱动相关函数或指令,可使用回调函数通知驱动给上层应用传递信息,来降低模块与模块之间的耦合。具体例子后期补充。 - 对于多个同一类函数可使用函数指针实现多态性,比如有一个模块需要轮询对多个设备执行读指令,但是设备不同,因此他们的读指令也不同,传入参数和返回参数都一致,这时可以用函数指针完成这个无,实现多态。
- 在C语言的结构体中实现C++类对象中函数功能,在定义结构体中定义函数指针,在初始化时对该函数指针进行赋值,这样结构体就可以升级成“面向对象”了
typedef struct
{
int privateValue;
int publicValue;
void (*printFunc)(int value);
}CPlusPlus_t;
int main(void)
{
CPlusPlus_t CPlusPlus = {-1,1,intPrintf};
CPlusPlus.printFunc(100);
return 0;
}
|