函数的指针可以指向不同的函数,从而完成不同的功能。话说, 函数指针是怎么定义呢? 函数指针和普通的指针没什么区别,只是函数指针是指向函数的指针。函数指针的定义方式起始和函数声明方式类似:
int (* g_pFun) (int x, int y); 这里定义了一个返回值为int类型,有两个int类型传入参数的函数
假如我在写代码的时候,写了一个这样的函数:
int Max(int x, int y)
{
}
g_pFun可以指向Max
g_pFun = Max
这样我们就可以使用g_pFun 来调用Max函数了, 比如,g_pFun(10, 12)和Max(10, 12)是一样的效果。
实例代码:
#include "stdio.h"
void fun1(void)
{
printf("i am fun1\r\n");
}
void fun2(void)
{
printf("i am fun2\r\n");
}
int main(int argc, char const *argv[])
{
void (* fun)(void); //定义一个函数指针
// 让fun指向fun1
fun = fun1;
// 执行fun
fun();
// 让fun指向fun2
fun = fun2;
// 执行fun
fun();
return 0;
}
运行结果:
注意:为了便于使用,函数指针往往被声明为全局变量,这也是刚才把函数指针的名字命名为g_pFun的原因。
下面我们来进行一下实战演习,比如,平台部分要执行某一个操作,但是具体的操作还不确定,我们完成这样的代码:
#include "stdio.h"
int (* g_pFun) (int x, int y); /*函数指针*/
int Plat(void)
{
int r;
int a = 10;
int b = 15;
r = g_pFun(a, b);
printf("%d\n", r);
return 0;
}
//另外,平台部分再提供一个注册函数:
int RegFun(int (*pFun)(int x, int y))
{
g_pFun = pFun;
return 0;
}
//应用模块完成具体的函数的功能:
int Max(int x, int y)
{
if(x > y)
{
return x;
}
else
{
return y;
}
}
int Min(int x, int y)
{
if (x < y)
return x;
else
return y;
}
int main(int argc, char const *argv[])
{
/* code */
RegFun(Min);
Plat();
RegFun(Max);
Plat();
return 0;
}
在嵌入式系统中,底层不知道应用层需要完成什么功能, 往往会提供像这样子的函数回调方式供应用层使用。