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