一、函数指针基础知识
完成函数指针需要的工作:
- 获取函数的地址。
- 声明一个函数指针。
- 使用函数指针来调用函数。
获取函数地址:只要使用函数名即可,如think()
是一个函数,则think
就是该函数的地址,要将函数作为参数进行传递,必须传递函数名。一定要区分传递的是函数的地址还是函数的返回值:
process(think);
thought(think());
//process()调用使得process()函数能够在其内部调用think()函数。
//though()调用首先调用think()函数,然后将think()得返回值传递给thought()函数。
声明函数指针:声明指向数据类型的指针时,必须指定指针指向的类型,声明指向函数的指针时,也必须指定指向的函数类型。如:
double pam(int);
则正确的指针类型声明如下:
double (*pf)(int);
与pam()
声明类似,只是将pam
替换为了(*pf)
。由于pam是函数,因此,(*pf)
也是函数。而如果(*pf)
是函数,则pf
就是函数指针。
为提供正确的运算符优先级,必须在声明中使用括号将*pf
括起来。括号的优先级比星号的运算符高,因此*pf(int)
意味着pf()
是一个返回指针的函数,而(*pf)(int)
意味着pf是一个指向函数的指针:
double (*pf)(int);//pf是一个指向函数的指针,所指函数的返回值类型为double
double *pf(int);//pf是函数名,此函数的返回值类型为double指针
//正确的声明pf后,便可以将相应函数的地址赋给它:
double pam(int);
double (*pf)(int);
pf=pam;
//注意,pam()的特征标和返回类型必须与pf相同。
指针来调用函数:(*pf)
扮演的角色与函数名相同,因此使用(*pf)时,只需要将它看作函数即可:
double pam(int);
double (*pf)(int);
pf=pam;
double x= pam(4);
double y=(*pf)(5);
//c++也允许像使用函数名那样使用pf:
double y= pf(5);
实例:
#include<iostream>
using namespace std;
double betsy(int);
double pam(int);
void estimate(int lines, double (*pf)(int));
int main()
{
int code;
cout << "How many lines of code do you need?";
cin >> code;
cout << "Here's Betsy's estimate:" << endl;
estimate(code, betsy);
cout << "Here's Pam's estimate:" << endl;
estimate(code, pam);
return 0;
}
double betsy(int lns)
{
return 0.05 * lns;
}
double pam(int lns)
{
return 0.03 * lns + 0.0004 * lns * lns * lns;
}
void estimate(int lines, double(*pf)(int))
{
cout << lines << "lines will take ";
cout << (*pf)(lines) << "hour(s)" << endl;
}
二、深入探讨函数指针
使用函数指针时面临挑战,下面一些函数的原型,他们的特征标和返回类型相同:
const double *f1(const double ar[],int n);
const