C++ 函数指针
以下内容参考C++ Primer Plus第六版
有了这个东西估计很多操作会方便很多.
int* sort_2(int *begin, int *end) {
sort(begin, end);
return begin;
}
int* sort_1(int *begin, int *end) {
sort(begin, end, greater<int> () );
return begin;
}
int make_seq(int* (*f)(int*, int*), int *n, size_t len) {
int first = *((*f)(n, n + len));
for (int* i = n; i != n + len; i += 1)
printf("%d ", *i);
puts("");
return first;
}
int main () {
int A[5] = {0, 3, 2, 5, 1};
auto f1 = sort_1, f2 = sort_2;
printf("%d\n", make_seq(f1, A, 5));
printf("%d\n", make_seq(f2, A, 5));
return 0;
}
一个比较简单的例子, 大概是包含了函数指针基本的使用吧.
声明及赋值
声明一个返回值为const int*
参数为(int *, int *)
标示符为f
的函数指针
const int* (*f)(int *, int *)
当然赋值时可以这样做:
const int* func(int * a, int *b) { // 一个函数
}
const int* (*f)(int *, int *) = func;
当然可以使用c++11
的自动类型推断
上面代码的最后一句改为
auto f = func;
调用
在一个函数中使用它
int func(const int *(*f) (int *, int *), int *begin, int *end) {
f(begin, end); //或者
(*f)(begin, end);
}
虽然根据我们对指针的认识, 下面的那个代码应该是正确的才对, 但是C++标准都允许.
显然是上面的方式更好写一些.
函数指针数组
其实和普通的指针数组差不多
auto f1 = sort_1, f2 = sort_2;
int* (*f[2])(int *, int *) = {sort_1, sort_2};
printf("%d\n", make_seq(f[0], A, 5));
printf("%d\n", make_seq(f[1], A, 5));
用typedef
进行简化
typedef const int *(*func)(int *, int *);
func a, b, c[3];
为什么要过别人为我安排的生活.