文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C中关于函数指针的复杂声明

C中关于函数指针的复杂声明

时间:2011-01-04  来源:tomjamescn

到目前为止,还没有编过复杂的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();


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载