函数指针
函数指针、指针函数一直都是一起出现的内容,但是两者知识名字相似罢了,基本没有什么关联。
指针函数:就是返回值是一个指针的函数,太过简单,我这里就不赘述了。
函数指针:是一个指向函数的指针,这个就有点意思了。听我慢慢道来。
int a[10];
int function(int i,int j);
这是我们定义的一个数组,众所周知,我们可以用数组名"a"来表示这个数组的地址。对于函数呢?我们同样可以用函数名“”“function”来表示函数的地址。那么,我们能不能重新定义一个函数指针来指向这个函数呢?当然是可以的!
int (*ptr_f)(int i,int j);
int* p;
特意将这两句放在一起作对比,第二句是定义了一个指向整形的指针,而第一句就是定义了一个指向形参是(int i,int j)返回值是int,的函数的指针。
p = a;
ptr_f = function;
初始化如上所示。
同样我们可以用typedef来定义对象类型
typedef int (*PTR_F)(int i,int j);
PTR_F ptr_f_1;
下面是一个小例子:
#include<iostream>
using namespace std;
int f_add(int& i,int& j){
return i+j;
}
int main(){
int i = 1;
int j = 2;
cout << f_add(i,j) << endl;
cout << (*f_add)(i,j) << endl;
cout << "############################" << endl;
int (*ptr_f_1)(int& i,int& j);
ptr_f_1 = f_add;
cout << ptr_f_1(i,j) << endl;
cout << (*ptr_f_1)(i,j) << endl;
cout << "############################" << endl;
typedef int (*PTR_F)(int& i,int& j);
PTR_F ptr_f_2;
ptr_f_2 = f_add;
cout << ptr_f_2(i,j) << endl;
cout << (*ptr_f_2)(i,j) << endl;
cout << "############################" << endl;
return 0;
}
结果:
3
3
############################
3
3
############################
3
3
############################
应用实例
我们费了这么大劲,到底是为了什么啊?当然是能用到啊,我会在这里举出几个例子,但是因为水平有限,只能写出一个例子,后面如果遇到其他例子我会持续更新的,如果大家有什么好的例子可以跟我留言我也会作为参考,更新博文。
- 将函数作为形参传入另外一个函数。
#include<iostream>
using namespace std;
double Integral_f(double (*function)(double x),const double& a,const double& b){
double dx = 0.000001;
double result = 0;
for(double xi = a; xi < b; xi += dx){
result += dx*(function(xi));
}
return result;
}
double my_function(double x){
return x*x;
}
int main(){
cout << Integral_f(my_function,0,3) << endl;
return 0;
}
结果:
9
没想到结果还挺准,这是一个计算积分的例子。我想你肯定用过那种函数,就是将自己写的函数作为一个形参传入函数进行计算。