声明指向某种数据类型的指针时,必须指定指针指向的类型。同样,声明指向函数的指针时,也必须指定指针指向的函数类型。这意味着声明应指定函数的返回类型以及函数的特征标(参数列表)。也就是说,声明应像函数原型那样指出有关函数的信息。例如,假设编写了一个估算时间的函数,其原型如下:
则正确的指针类型声明如下:
这与pam( )声明类似,只是将pam替换为(*pf)。由于pam是函数,因此(*pf)也是函数。而如果(*pf)是函数,则pf就是函数指针。
通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*pf)替换函数名。这样pf就是这类函数的指针。
为提供正确的运算符优先级,必须在声明中使用括号将*pf括起。括号的优先级比*运算符高,因此*pf(int)意味着pf( )是一个返回指针的函数,而(*pf)(int)意味着pf是一个指向函数的指针:
正确地声明pf后,便可以将相应函数的地址赋给它:
注意,pam( )的特征标和返回类型必须与pf相同。如果不相同,编译器将拒绝这种赋值:
假设要将将要编写的代码行数和估算算法(如pam( )函数)的地址传递给它,则其原型将如下:
上述声明指出,第二个参数是一个函数指针,它指向的函数接受一个int参数,并返回一个double值。要让estimate( )使用pam( )函数,需要将pam( )的地址传递给它:
显然,使用函数指针时,比较棘手的是编写原型,而传递地址则非常简单。