函数是实现特定功能的程序代码的集合,实际上,函数代码在内存中也要占据一段存储空间(代码区内),这段存储空间的起始地址称为函数入口地址。C++规定函数入口地址为函数的指针,即函数名既代表函数,又是函数的指针(或地址)。
C++允许定义指向函数的指针变量,定义形式为:
返回类型 (*函数指针变量名)(形式参数列表),...;
它可以指向如下形式的函数:
返回类型 函数名(形式参数列表)
{
函数体
}
int (*p)(int a, int b); //定义函数指针变量
使函数指针指向函数 ,可以将函数的地址赋值给函数指针变量,形式为:
函数指针变量=函数名;
它要求函数指针变量与指向函数必须有相同的返回类型、参数个数、 参数类型。
例如假设:
int max(int a, int b); //max函数原型
int min(int a, int b); //min函数原型
int (*p)(int a, int b); //定义函数指针变量
p=max;//p是指向max函数的指针
它也可以指向函数min,即可以指向所有与它有 相同的返回类型、参数个数、参数类型的函数。
通过函数指针调用函数
对函数指针间接引用即是通过函数指针调用函数,一般形式为:
函数指针(实参列表)
通过函数指针调用函数,在实参、参数传递、返回值等方面与函数名调用相同。例如:
c=p(a,b); //等价于c=max(a,b);
函数指针的用途:
指向函数的指针多用于指向不同的函数,从而可以利用指针变量调用不同函数,相当于将函数调用由静态方式(固定地调用指定函数) 变为动态方式(调用哪个函数是由指针值来确定)。
#include <iostream>
#include <cmath>
using namespace std;
double integral(double a,double b,double (*f)(double x))
{ //求定积分
int n=1000, i;
double h, x, s=0.0;
h=(b-a)/n;
for(i=1;i<=n;i++) {
x=a+(i-1)*h;
s=s+(f(x)+f(x+h))*h/2; //调用f函数求f(x)、f(x+h)
}
return s;
}
double f1(double x)
{ return 1+x;
}
double f2(double x)
{ return exp(-x*x/2);
}
double f3(double x)
{ return x*x*x;
}
int main()
{
double a,b;
cin>>a>>b;
cout<<(integral(a,b,f1)+integral(a,b,f2)+integral(a,b,f3))<<end l;
return 0;
}