• C++复习之函数指针


    要定义一个指针指向无参无返回值的函数,可以写成:

    void (*funcPtr)();

    //上面切不可定义成为了void *funcPtr();

    当我们看到这样的一个复杂的定义,最好的方法就是”中-右-左-右”的看了,先从”中间开始”(“funcPtr是一个…”),向右边走(没有东西,被右括号拦住了),向左走并发现一个’*’(“…指针指向一个…”),向右走并发现一个空参数表(“…没有带参数的函数…”),向左走发现一个void,(“funcPtr是一个指针,它指向一个不带参数并返回void的函数”).

    我们再来看看更坑爹的定义:

    /*1.*/ void *(*(*fp1)(int))[10];

    /*2.*/ float (*(*fp2)(int,int,float))(int);

    /*3.*/ typedf double (*(*(*fp3)())[10])();

    /*4.*/ int (*(*f4())[10])();

    不知道你看了感觉如何,我反正看了是莔了,我就没遇见过…

    第一行是说 fp1是一个指向函数的指针,该函数接受一个整形并返回一个指向含有10个void指针数组的指针

    第二行说 fp2是一个指向函数的指针,该函数接受三个参数(int ,int ,float),且返回一个指向函数的指针,该指针接受一个整形并返回一个float

    第三行 fp3同样也为函数指针,该函数无参,且返回一个指向10个元素的的数组的指针,其中数组的元素类型为函数指针,且无参返回double类型(typedf我就不说了)

    这里我们注意了第四个就不是函数指针了,而是函数的声明,它说明f4是一个无参且返回指针的函数,该指针指向含有10个元素的数组,且该数组的元素类型为函数指针,无参并返回int类型.

    学艺不精,真的就没见过……

    我们再看看它的应用:

    //根据控制台输入动态调用函数…

    #include <IOSTREAM>
    using namespace std;

    #define DF(N) void N(){ \
        cout<<"Function "#N " called..."<<endl; }

    DF(a);DF(b);DF(c);DF(d);DF(e);DF(f);DF(g);

    //这里定义了一个函数指针数组,元素为宏定义生成

    void (*func_table[])()={a,b,c,d,e,f,g};

    int main()
    {
        while (1)
        {
            cout<<"press any key form a to g"
                "or press q to quit"<<endl;

            char c,cr;
            cin.get(c);cin.get(cr);
            if (c=='q')break;
            if (c<'a' || c>'g')continue;
            (*func_table[c-'a'])();
        }
        return 0;
    }

  • 相关阅读:
    理解volatile与synchronized
    实现任意两个数的互换
    增删改查+部分前段内容
    Hibernate知识点小结汇总
    Spring知识点小结(一)
    JDBC相关
    Redis工具之Jedis
    Hibernate知识点小结(四)--JPA
    Hibernate知识点小结(三)-->一对多与多对多配置
    Hibernate知识点小结(二)
  • 原文地址:https://www.cnblogs.com/asiancount/p/2377307.html
Copyright © 2020-2023  润新知