函数指针是指向函数的指针,跟指向变量的指针没差。

函数的一个属性就是其地址指明了函数体在内存中的位置,在调用函数时,系统将控制权给这个位置来执行函数。

用一个函数来举例

1
2
3
4
double f(double x)
{
return 2*x;
}

这里,f是指向函数f()的指针,*f()是函数本身, (*f)(7)是调用这个函数并取得值,其本质跟f(7)没有任何差别,只是在大多数编程语言中(包括 C 和 C++),编译器会自动理解f是一个函数指针并进行适当的解引用。

函数指针一般在需要函数作为一个变量的时候起到作用,即函数作为参数传递,如当要求n到m之间用函数f的总和时:

1
2
3
4
5
6
7
8
double sum(double (*f)(double), int n, int m)
{
double result = 0;
for (int i = n; i <= m ; ++i)
result += f(i);

return result
}

这里,double (*f)(double)是指f为指向一个返回double,输入值为double的函数指针,那么实际上传入的function就可以是满足输入和输出的多变的模式,极大地提高了灵活性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double square(double x) {
return x * x;
}

double cube(double x) {
return x * x * x;
}

double identity(double x) {
return x;
}

#include <iostream>

int main() {
// 三种不同的function都可以被当作参数传递进去
std::cout << "Sum of squares from 1 to 3: " << sum(square, 1, 3) << std::endl;
std::cout << "Sum of cubes from 1 to 3: " << sum(cube, 1, 3) << std::endl;
std::cout << "Sum of identity from 1 to 3: " << sum(identity, 1, 3) << std::endl;

return 0;
}

拓展来说,double *f(double)则是一个函数声明,表示 f 是一个函数,它接受一个 double 类型的参数,并返回一个指向double类型的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
double* f(double x) {
double* result = new double(x * 2); // 动态分配一个 double 并将其值设置为 x 的两倍
return result; // 返回的是一个指向double这个值的指针
}

#include <iostream>

int main() {
double value = 5.0;
double* result = f(value); // 定义一个double指针

std::cout << "Result: " << *result << std::endl; // 输出指针指向的值,解引用

delete result; // 释放动态分配的内存
return 0;
}

所以double (*f)(double)代表的是一个指向返回double,输入为double的函数指针。函数指针可以让函数作为参数被灵活地使用。