指向函数的指针(四)

来源:互联网 发布:淘宝资产变现 编辑:程序博客网 时间:2024/06/10 10:17

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

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

定义函数指针:

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()的返同类型为函数类型