[P238, C++ Primer, 7.9]

1.函数与函数指针

在C++中,直接使用一个函数名很可能会被自动转换为使用该函数的指针。

// 使用函数名等价于使用函数的指针。
void sub()
{
}
 
int main()
{
	sub();
	(&sub)(); // 实质和上一行相同。
	void (*psub)();
	psub = sub;
	psub(); // 实质相同。
}

类似的,传递函数形参时,定义为传递函数和传递函数指针是等价的。

void sub(int (int))
{
}
void _sub(int (*)(int))
{
}
int sub3(int a)
{
	return a;
}
int main()
{
	sub(sub3);
	_sub(sub3); //等价
}

2.定义返回值是函数指针的函数

普通的定义方法显得非常晦涩难懂。试图理解以下函数原型:

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

它的含义是:定义一个函数 ff,带有一个 int 类型的形参。其返回值为 int *(*)(int*, int),即返回一个带有 (int*,int) 的形参类型并返回 int * 类型的函数指针。
注意:对于该原型中的第二个 *,如果修改为 (*)ff(int),含义就改变为 ff(int)本身成为了函数指针。由于没有带括号,ff(int) 只是普通函数,* 修饰的含义是表明其返回值为指针类型。
所以我们有必要对这样晦涩难懂的返回函数指针的函数进行简化。方法是使用万能的 typedef

typedef int * (*pfun)(int*, int);
pfun ff(int);

3.指向重载函数的指针

使用这种指针时,必须注意,指针一定要和某一重载版本的函数完全对应。否则,对该指针的赋值将产生编译时错误。