函数指针的基础知识
完成一个函数指针,我们必须先完成下面的工作:
1、获取函数地址
2、声明一个函数指针
3、使用函数指针来调用函数
1、获取函数地址
获取函数指针很简单,只要使用函数名(后面不必跟参数)即可。也就是说,如果think()是一个函数,则think就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。一定要区分传递的是函数的地址还是函数的返回值:
process(think); //传递函数指针
process(think()); //传递函数返回值
2、声明函数指针
声明指向某种数据类型的指针时,必须指定指针指向的类型。所以声明函数指针时,必须指定函数类型,这意味着声明必须指定函数返回值的类型以及函数参数列表的类型。下面有一个函数正常声明和这个函数指针的声明:
double pam(int);
double (*pf)(int);
这是将(*pf)替换了pam,pam是一个函数,所以(*pf)也是一个函数,那么pf则是一个指针。
提示:通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*pf)替换函数名,则pf就是函数指针。
正确声明函数指针之后我们就可以将函数名赋值给已经声明的函数指针:
double (*pf)(int); //注意(*pf)必须要用括号括起来否则会变成返回指针的函数
double pam(int);
pf = pam;//注意pam的参数列表和pf的必须要相同,不然编译器会报错
3、使用指针来调用函数
现在进入最后一步,即使用指针来调用被指向的函数。前面讲过,(*pf)扮演的角色与函数名相同,因此使用(*pf)时,只需要将它看做是函数名即可。
double pam(int);
double (*pf)(int);
pf = pam;
double x = pam(4);
double y = (*pf)(5);
实际上c++也允许像使用函数名那样使用pf,如下课件。虽然第一种格式不太好看,但是它给出了强有力的提示——代码正在使用函数指针。
double x = pf(5)
函数指针实例
//fun_ptr.cpp
#include <iostream>
double betsy(int);
double pam(int);
void estimate(int lines, double (*pf)(int));
int main()
{
using namespace std;
int code;
cout << "How many lines of code do you need?";
cin >> code;
cout << "Here's Betsy's estimate:\n";
estimate(code, betsy);
cout << "Here's Pam's estimate:\n";
estimate(code, pam);
return ;
}
double betsy(int lns)
{
return 0.05 * lns;
}
double pam(int lns)
{
return 0.03 * lns + 0.0004 * lns * lns;
}
void estimate(int lines, double (*pf)(int))
{
using namespace std;
cout << lines << "lines will take ";
cout << (*pf)(lines) << " hour(s)\n";
}