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;
}

posted @ 2012-03-02 15:41  小小度亚  阅读(215)  评论(0编辑  收藏  举报