现在的位置: 首页 > 综合 > 正文

C++基础重温之一:指向函数的指针

2013年03月19日 ⁄ 综合 ⁄ 共 1041字 ⁄ 字号 评论关闭

 1. 指向函数的指针的类型

下面是函数lexicoCompare()的定义它按字典序比较两个字符串
#include <string>
int lexicoCompare( const string &s1, const string &s2 ) {
    return s1.compare(s2);
}

函数名不是其类型的一部分函数的类型只由它的返回值和参数表决定指向lexicoCompare()的指针必须指向与lexicoCompare()相同类型的函数(带有相同的返回类型和相同的参数表).让我们试一下
   
int *pf( const string &, const string & ); // 喔! 差一点
这几乎是正确的问题是编译器把该语句解释成名为pf 的函数的声明它有两个参数并且返回一个int*型的指针参数表是正确的但是返回值不是我们所希望的解引用操作符* 应与返回类型关联所以在这种情况下是与类型名int 关联而不是pf 要想让解引用操作符与pf 关联括号是必需的
    int (*pf)( const string &, const string & ); // ok: 正确
这个语句声明了pf 是一个指向函数的指针该函数有两个参数和int 型的返回值即指向函数的指针它与lexicoCompare()的类型相同.

2.初始化和赋值

将取地址操作符作用在函数名上也能产生指向该函数类型的指针因此lexicoCompare和&lexioCompare 类型相同指向函数的指针可如下被初始化
    int (*pfi)( const string &, const string & ) = lexicoCompare;
    int (*pfi2)( const string &, const string & ) = &lexicoCompare;

指向函数的指针可以如下被赋值
   
pfi = lexicoCompare;
    pfi2 = pfi;

3.函数指针的数组

我们可以声明一个函数指针的数组例如
    int (*testCases[10])();
将testCases 声明为一个拥有10 个元素的数组每个元素都是一个指向函数的函数指针该函数没有参数返回类型为int

像数组testCases 这样的声明非常难读因为很难分析出函数类型与声明的哪部分相关在这种情况下使用typedef 名字可以使声明更为易读例如
   
// typedefs 使声明更易读
    typedef int (*PFV)(); // 定义函数类型指针的typedef
    PFV testCases[10];

testCases 的这个声明与前面的等价.

抱歉!评论已关闭.