在《c++程序设计》一书中之处对象名是对象在内存空间的一个地址映射,函数名也对应于函数的执行代码的入口地址。指针可以指向一个对象,也可以指向一个函数,函数类型由返回值类型和形参列表决定。
例如函数:
bool compareInt(int,int);
接下来定义一个指向此类型函数的指针
bool(*pf)(int, int); //注意pf要加上括号
接着可以将指针指向函数
bool(*pf)(int,int)=compareInt; //隐式初始化
bool(*pf)(int,int)=&compareInt; //显式初始化
bool(*pf)(int,int)=nullptr; //不指向任何函数
对于函数指针的利用(参考浙江大学c语言程序设计进阶mooc)
#include<iostream>
using namespace std;
void f(int i)
{
cout<<"in f()"<<i<<endl;
}
void g(int i)
{
cout<<"in g()"<<i<<endl;
}
void h(int i)
{
cout<<"in h()"<<i<<endl;
}
int main()
{
int i=0;
/*using FA= void(*)(int);
FA fa[]={f,g,h};*/
/*typedef void(*FA[])(int); //三种函数指针均有效,且效果相同
FA fa={f,g,h};*/
void (*fa[])(int)={f,g,h}; //用函数数组有利于后期直接增加函数
cin>>i; //由用户来决定使用哪个函数
if(i>=0&&i<=(sizeof(fa)/sizeof(fa[0])))
fa[i](0); //(*fa[i](0)效果一样
return 0;
}
这里列出了三种函数指针初始化的方式,其中using的方法比较常见,前两种有利于提高程序的简洁性。
同时函数指针有利于在函数中调用函数
#include<iostream>
int plus(int a, int b)
{
return a + b;
}
int minus(int a, int b)
{
return a - b;
}
void cal(int (*f)(int, int))
{
cout << (*f)(2, 3) << endl;
}
int main()
{
cal(plus);
cal(minus);
return 0;
}
最后以一个实际运用例子来展示:
利用梯形法设计一个求数值积分的通用函数
#include <iostream>
#include<cmath>
using namespace std;
using pFun = double(*)(double);
double f_sphere(double x) {
return x * x;
}
double f_default(double x) {
return 0;
}
double f_sin(double x) {
return sin(x);
}
double integrate(double l, double u, pFun pf = f_default, int n = 1000) {
double sum = 0.0;
double gap = (u - l) / n; //每个间隔的长度
for (int i = 0; i < n; i++)
sum += (gap / 2.0) * (pf(l + i * gap) + pf(l + (i + 1)*gap));
return sum;
}
int main()
{
cout << "默认函数在区间[0:1]上的积分为:" << integrate(0, 1) << endl;
cout << "Sphere函数在区间[0:1]上的积分为:" << integrate(0, 1, f_sphere) << endl;
cout << "sin函数在区间[0:1]上的积分为:" << integrate(0, 1, f_sin) << endl;
return 0;
}