函数指针
函数指针是指向函数的指针,跟指向变量的指针没差。
函数的一个属性就是其地址指明了函数体在内存中的位置,在调用函数时,系统将控制权给这个位置来执行函数。
用一个函数来举例
1 | double f(double x) |
这里,f
是指向函数f()
的指针,*f()
是函数本身, (*f)(7)
是调用这个函数并取得值,其本质跟f(7)
没有任何差别,只是在大多数编程语言中(包括 C 和 C++),编译器会自动理解f
是一个函数指针并进行适当的解引用。
函数指针一般在需要函数作为一个变量的时候起到作用,即函数作为参数传递,如当要求n到m之间用函数f的总和时:1
2
3
4
5
6
7
8double 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
22double square(double x) {
return x * x;
}
double cube(double x) {
return x * x * x;
}
double identity(double x) {
return x;
}
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
16double* f(double x) {
double* result = new double(x * 2); // 动态分配一个 double 并将其值设置为 x 的两倍
return result; // 返回的是一个指向double这个值的指针
}
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的函数指针。函数指针可以让函数作为参数被灵活地使用。