函数指针

原函数声明:
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中程序的目的

posted @ 2020-03-20 15:29  坦坦荡荡  阅读(180)  评论(0)    收藏  举报