C++函数指针

指向函数

可以将函数的地址赋值给函数指针变量,它要求函数指针变量必须与指向函数必须有相同的返回类型,参数个数,参数类型。例如,假设:

1
2
3
int max(int a, int b);  
int min(int a, int b);
int (*p)(int a, int b); //定义函数指针变量


1
p = max;

p指向函数max。当然也可以指向min,即它可以指向所有与它有相同的返回类型,参数个数和参数类型的函数。

通过函数指针调用函数

对函数指针间接引用即是通过函数指针调用函数。通过函数指针调用函数,在实参,参数传递,返回值等方面与函数名调用相同。例如:

1
2
c = p(a, b);
b = (*p)(a, b); // 等价

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int max(int a, int b)
{
return a>b?a:b;
}
int min(int a, int b)
{
return a>b?b:a;
}
int main()
{
int (*p)(int a, int b); // 定义函数指针变量
p = max; // p指向max函数
cout << p(3, 4) << " "; // 通过p调用函数,输出 4
p = min; // p指向min函数
cout << p(3, 4) << " "; // 通过p调用函数,输出 3
return 0;
}

函数指针作为参数

指向函数的指针多用于指向不同的函数,从而可以利用指针变量调用不同函数,相当于将函数调用由静态方式(固定地调用指定函数)变为动态方式(调用哪个函数由指针值来确定)。

如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cmath>
using namespace std;
double integral(double a, double b, double (*f)(double x)) //求定积分
{
int n = 1000, i;
int h, x, s = 0.0;
h = (b-a)/n;
for (i = 0; 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 x + 1;
}
double f2(double x)
{
return exp(-x*x/2);
}
double f3(double x)
{
return x*x*x;
}
int main()
{
double a = 0.0, b = 1.0;
cout << integral(a, b, f1) + integral(a, b, f2) + integral(a, b, f3) << endl; // 输出2.60562
return 0;
}

Reference