到目前为止,还没有编过复杂的C/C++程序,所以基本就没有用过函数指针,更谈不上函数指针数组,以及更复杂的返回函数指针数组的函数了。这里做一个梳理!
首先,看看函数指针:
void (*aFunPointer)(int);//一个函数指针变量,指向的函数声明为void fun(int)
//如果需要调用,则写法为void r = (*aFunPointer)(arg);
|
但是,上面这种声明方式用着不方便,因为仅仅是声明了一个变量,没办法对其进行复用,如果要声明一个函数指针类型,如下
typedef void (*FunPointerType)(int);//一种函数指针类型,这个类型指向的函数声明为void fun(int)
FunPointerType aFunPointer;//和上面的代码声明的函数指针变量等价
|
有了函数指针,就来看看函数指针数组,参考了资料:
void function0(); void function1(); void function2();
void (*aFunPointerArray[])() = { function0, function1, function2, 0 };//函数指针数组每个元素是一个函数指针,指向void fun()的函数
|
同样的,上面这种声明方式用着不方便,因为仅仅是声明了一个变量,没办法对其进行复用,如果要声明一个函数指针数组,如下
typedef void (*FunPointerArrayType[])(); //声明一个函数指针数组类型
FunPointerArrayType aFunPointerArray = { function0 , function1 ,0};//定义一个函数指针数组变量
//调用
(*aFunPointerArray[0])(); (*aFunPointerArray[1])();
|
再来讨论如何声明返回函数指针的函数
void (*fun(int))(int);//fun是一个函数,参数是int,返回值是一个函数指针,这个函数指针的类型为void (* FunPointerType )(int),即声明为void
FunPointerType(int)的函数
//上面的声明等同于:
typedef void (*FunPointerType)(int);
FunPointerType fun(int);
//linux下的信号处理函数signal就是一个返回函数指针的函数:
//在signal.h中,signal的声明如下:
typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
//上面两行等同于
void (*signal(int sig, void (*func)(int)))(int);
|
最后看看,返回指向(函数指针数组)的指针的函数的声明
//此例子来自于C程序设计语言,即The.C.Programming.Language的5.12节。
//返回的函数指针数组类型为char (*FunPointerArrayType[])(),
//每一个函数指针指向形如char fun()声明的函数
//这个函数指针数组的指针为 char (*(*FunPointerArrayPointerType[]))(),
//函数x的原型为 x();将上面一行中的 FunPointerArrayPointerType 用x()进行替换得到
char (*(*x())[])();
//上面的声明等价于什么,我没有弄明白
|
还有一个例子,单独拿出来
char (*(*x[3])())[5]
//按照书上的说法是,
//x: array[3] of pointer to function returning pointer to array[5] of char
//即,x是一个函数指针数组,大小为3,每一个函数指针指向的函数声明为
typedef char (*PPP)[5];
PPP fun();
阅读(364) | 评论(0) | 转发(0) |