博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指向函数的指针(四)
阅读量:4029 次
发布时间:2019-05-24

本文共 1353 字,大约阅读时间需要 4 分钟。

指向函数的指针的类型就是函数的类型。函数的类型与函数名无关,只与函数返回值和参数有关。

函数指针和其他类型指针一样,可以指向不同的具有相同类型的函数。

定义函数指针:

int *pf( const string &, const string & ); // ! 差一点

int (*pf)( const string &, const string & ); // ok: 正确

第一个定义是错误的,编译器会认为是定义了一个pf函数,其返回值为一个int指针。为了将(*)pf相关联,而不是和int相关联,使用括号。

正如不带下标操作符的数组名会被解释成指向首元素的指针,当一个函数名没有被调用操作符修饰时,也会被解释成指向该类型函数的指针。

lexicompare;被解释为类型 int (*) (const string &, const string &)的指针。

//初始化,以下均可以

int (*pf1)( const string &, const string & ) = lexicompare;

int (*pf2)( const string &, const string & ) = &lexicompare;

//赋值

pf1 lexicompare;

pf2 = pf1;

只有当左边指针参数列表和返回值与右边函数类型的参数列表和返回值完全相同时,编译才正确。在指向函数类型的指针之间不存在隐式类型转换

函数指针可以用0来初始化或赋值,表明不指向任何函数。

使用函数指针可以调用其指向的函数,如下:

pf1(a, b);

(*pf1)(a, b);

两种方式都可以,但第二种方式使人知道是通过函数指针运行的。

 

// typedefs 使声明更易读

// 定义函数类型指针的typedef,指PFVint (*) ()的别名

// 注意与typedef double dd; 的不同

typedef int (*PFV)();

//展开即是int (*testCases[10]) ()

PFV testCases[10];

 

指向函数指针数组的指针

PFV (*pf)[2];

对上式的解析:(*)pf关联,表明是一个指针,[2]表明该指针指向两个元素的数组,PFV表示指针类型。

 

除了用作参数外,函数指针也可以作为函数返回值。

int (*ff( int ))( int*, int );

该声明将ff()声明为一个函数,它有一个int 型的参数,返回一个指向函数的指针类型为

int (*) ( int*, int );

同样使用typedef 名字可以使声明更容易读懂,例如下面的typedef PF 使得我们能更容易地分解出ff()的返回类型是函数指针

// typedef 使声明更易读

typedef int (*PF)( int*, int );

PF ff( int );

但注意:

函数不能声明返回一个函数类型,如果是,则产生编译错误。例如函数ff()不能如下声明

// typedef 表示一个函数类型

typedef int func( int*, int );

func ff( int ); // 错误: ff()的返同类型为函数类型

转载地址:http://dztbi.baihongyu.com/

你可能感兴趣的文章
yuv420 format
查看>>
单纯的把Y通道提取出来能正确显示出灰度图来为什么我的Qt就显示不出来呢转换有问题呀?
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>
/dev/input/event0 键盘输入
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
输入设备节点自动生成
查看>>
opencv test code-1
查看>>
eclipse 导入先前存在的项目
查看>>
GNU hello代码分析
查看>>