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];
posted @ 2018-10-23 21:26  Grary  阅读(400)  评论(0编辑  收藏  举报
博客园 首页 私信博主 编辑 关注 管理 新世界