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;}
运行结果如下:
- C++的函数指针和宏定义——define、typedefine
- 整理:#define和typedefine的区别 以及const修饰指针的用法
- C语言define定义数组和函数指针
- C++/C 宏定义(define)中#和## 的含义
- 内联(inline)函数和宏定义(#define)的区别
- #define typedefine区别
- C语言宏定义:define(fmt,arg...)和define(fmt,arg, ...)的区别。
- C——函数指针和指针函数的区别
- C宏定义#define
- 函数指针数组和C变量的定义方式
- #define和typedef在定义指针类型上的优劣
- c 函数指针 和 返回函数指针的函数 的定义方法
- C&C++中的宏定义——#define
- 函数指针和 宏定义
- c语言—指针高级和宏定义
- 宏定义——#define
- #define宏定义的优点和缺点
- const和#define宏定义的区别
- 掌握了这些衍生模式,储蓄升值不再被坑
- EasyUI 动态添加标签页
- lua 算法题集(1)
- linux下I2C驱动架构全面分析
- Worker::setProcessTitle()解析
- C++的函数指针和宏定义——define、typedefine
- 常见的mysql数据库的优化
- BLE-CC2640R2F-(01)off-oad片外空中升级
- 高可用Docker容器云在58集团的实践
- 亿图图示完全破解版(edraw max)软件介绍
- Mac上终端的命令总结
- 10.17考试爆炸记
- 机器学习笔记——相对熵 交叉熵
- SpringMVC+MyBatis框架整合