函数指针
原函数声明:
void add(int a, int b)
{
cout << a + b << endl;
}
用一个指针把函数名替换,得到函数指针
void (*p1)(int a, int b);//函数void add(int a,int b)的函数名add就是函数的地址。将地址add赋值给指针p1,就可以通过函数指针p1直接调用函数了。
//指针p1指向的函数,输入参数为int a.int b,返回值为double
指针p1的类型为void (*) (int a,int b),表明指针是一个指向某个函数的指针
指针指向的类型为void () (int a,int b)
赋值:
p1 = pdd;
或者直接定义:
void (*p1)(int a, int b) = add;
调用:
(*p1)(1,2);
可以使用typedef进行简化
bool check(int a)
{
if (a > 0)
{
return true;
}
else
{
return false;
}
}
typedef bool(*ptr)(int );
ptr pFun1;
pFun1 = check;
const double *f1(const double ar[],int n); const double *f2(const double [],int); const double *f3(const double *,int);
这三个函数的特征标看似不同,实际相同。函数原型中,可以不提供变量名,有类型列表就足够。
声明这三个函数的函数指针
const double *(*p1)(const double *,int); //可以同时声明和初始化 const double *(*p2)(const double *,int)=f1; //使用auto auto p2=f2;
在有三个函数的情况下,可以声明一个包含三个函数指针的数组
const double *(*pa[3])(const double *,int);={f1,f2,f3}; //调用 const double*px=pa[0](av,3);
函数指针的意义:
1.回调函数
最一个例子说明一下什么是回调函数:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。
在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做 触发回调事件,店员给你打电话叫做 调用回调函数,你到店里去取货叫做 响应回调事件。
回调函数就是你写一个函数,把函数地址赋值一个函数指针,然后把这个函数指针当作参数赋给另一个函数,另一个函数通过函数指针的地址调用这个函数,就是回调函数,
比如,我们写A B C D 四个函数,封装成一个库文件,然后我们的主函数里面要写一个功能函数,这个功能要用到函数A,假如不用函数指针,这个功能函数就要调用函数A,下次如果用到函数B,那么我们得删掉A,调用函数B,每次都要修改这个函数很麻烦,但如果使用回调函数就不一样了,我们可以定义4个函数指针,把4个函数的地址分别赋给4个函数指针,然后将函数指针当作参数传递给功能函数,功能函数就可以通过修改参数来调用对应的函数,而它本身不用做任何的修改。
#include <stdio.h> #include <stdlib.h> float ADD(float a, float b) { return a + b; } float SUB(float a, float b) { return a - b; } float MUL(float a, float b) { return a * b; } float DIV(float a, float b) { return a / b; } float (*A)(float x, float y) = ADD; float (*B)(float x, float y) = SUB; float (*C)(float x, float y) = MUL; float (*D)(float x, float y) = DIV; float fun(float x, float y, float(*p)(float x, float y)) { return p(x, y); } int main() { printf("%f", fun(2, 3, A)); }
2.引用不在代码段中的函数
用户程序的code是存放在代码段中的,在嵌入式系统中,一般情况下是存放在flash中的
当我们想在用户程序中调用这些系统函数时,就只能使用函数指针的方式,通过将系统函数的入口地址传给函数指针,来达到调用rom中程序的目的
浙公网安备 33010602011771号