C++的函数指针和宏定义——define、typedefine

来源:互联网 发布:火线 知乎 编辑:程序博客网 时间:2024/05/18 18:17

函数指针初步

先引用一下《C++ Primer Plus 》中对函数指针的介绍:“与数据项类似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。”一般而言我们不关心函数代码的地址,而专注于函数的具体实现,但是在看px4原生固件启动代码文件中,我发现代码中会用函数指针来对定义的宏(nsh_main入口函数)格式进行限制,所以专门看了函数指针这一块。如果不是直接调用函数,而是通过使用函数指针的方式,我们需要做三步:

 1. 获取函数的地址 2. 声明一个函数指针 3. 使用函数指针来调用函数

需要注意的是,和数组类似,函数名实际上就是函数的地址,看下面的例子:

process(think)process(think())

这里面第一个是调用think函数,因为函数名就是地址,是通过函数指针方式调用函数,而第二个process(think())则是以think函数的返回值作为process()的参数的,现在如果我们要怎么声明一个函数指针呢?很简单,见下面:

double pam(int);//prototypedouble (*pf)(int);//function pointerpf=pam

上面就将pf指向了pam()函数,为此我写了一个简单的Hello World!来看一下函数指针的效果:

#include <iostream>using namespace std;void PRIN();void INVOKE(void (*pf)());int main(){    INVOKE(PRIN);    return 0;}void PRIN(){    cout<<"Be concentrative!"<<"方辰!"<<endl;}void INVOKE(void (*pf)()){    (*pf)();}

记住在INVOKE函数中,其特征表为函数指针时该如何声明(既要特征标,还需指明被调用函数的返回值类型)。


深入函数指针

我们还可能遇到这种情况,我们遇到一组函数,它们的特征标和返回值都一样,这时候如果一个个的写是不是很不方便呢,我们一定很快想到了一个重要的东西——指针数组,把这种特性相同的函数簇放到一个数组中,先上程序:

#include <iostream>using namespace std;double s, *c;const double * f1(double,double);const double * f2(double,double);const double * (*p[2])(double,double)={f2,f1};int main(){   cout<<(*p)(4,3)<<"  "<<*(*p)(4,3)<<endl;   cout<<(*p[1])(4,3)<<"  "<<*(*p[1])(4,3)<<endl;   return 0;}double * ( *p[2])(double,double)={f1,f2};const double * f1(double a,double b){       //double s ;        //double *c;       s=a+b;       c=&s;       return c;}const double * f2(double a,double b){    //double s, *c;    s=a-b;    c=&s;    return c;}

这里面我们 定义了一个存放返回double类型指针,形参为两个double类型变量的函数指针数组,记住,在调用时时(*p[]),因为[]的优先级比较高,这个类似定义指向数组的指针一样。
有时候我们会觉得每次这样写非常麻烦,代码不够整洁,所以引入了typedef:

typedef const double *(*p)(int,int);p p1[2]={f1,f2};

这里的p1[0]指向f1,p1[2]指向f2。


define和typedefine

define和typedefine实际上很像,define是用来替代,而typedefine用来声明别名。它们的一个重要区别如下:

#define FLOAT_POINTER float *typedefine float* FLOAT_POINTER_N; FLOAT_POINTER a,b; FLOAT_POINTER_N c,d;

上面代码中,a,c,d是指针,b是float类型数据,这就是define和typedefine最大的区别!所以一般而言,typedefine更常用一些,具体见:typedefine和define
一个简单程序可以演示一下:

#include <iostream>using namespace std;#define FLOAT_POINTER float *typedef float* FLOAT_POINTER_1;int main(){    float a=8,b=9,c=10,d=11;    FLOAT_POINTER_1 aa=&a,bb=&b;    FLOAT_POINTER cc=&c,dd=d;    cout <<aa<<" "<<*aa<<endl;    cout<<bb<<" "<<*bb<<endl;    cout <<cc<<" "<<*cc<<endl;    cout<<dd<<endl;    return 0;}

运行结果如下:
这里写图片描述

原创粉丝点击