Bootstrap

c++函数指针

一、函数指针基础知识

完成函数指针需要的工作:

  1. 获取函数的地址。
  2. 声明一个函数指针。
  3. 使用函数指针来调用函数。

获取函数地址:只要使用函数名即可,如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
;