zoukankan      html  css  js  c++  java
  • 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
    ", make_seq(f1, A, 5));
    	printf("%d
    ", 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
    ", make_seq(f[0], A, 5));
    	printf("%d
    ", make_seq(f[1], A, 5));
    

    typedef进行简化

    typedef const int *(*func)(int *, int *);
    
    func a, b, c[3];
    
  • 相关阅读:
    园友五一快乐
    silverlight 2.0 入门教程(三)
    AJXA控件示例之   Accordion
    LINQ学习入门教程(一)
    泛型学习笔记
    梆定一个方法并把数据库中的值作为参数
    翻译IP地址转换成IP Number并得到国家
    vs 2005中解决找不到模板项
    silverlight 入门学习(二)
    最近的学习计划
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/9839502.html
Copyright © 2011-2022 走看看