Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1438687
  • 博文数量: 704
  • 博客积分: 10140
  • 博客等级: 上将
  • 技术积分: 6230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 20:41
文章分类

全部博文(704)

文章存档

2013年(1)

2012年(16)

2011年(536)

2010年(151)

分类: C/C++

2011-01-06 22:07:08

到目前为止,还没有编过复杂的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) |
给主人留下些什么吧!~~