管理员
最后登录1970-1-1
在线时间 小时
注册时间2013-3-25
|
在CU的C/C++版上看到一些比较复杂的函数声明:
- void (*(*p) (void *(*) (char *, long , long ))) (char *, long , long);
- void (*tpsetunsol (void (_TMDLLENTRY *)(*disp) (char *data, long len, long flags))) (char *data, long len, long flags);
- void double (*(*(*fp)())[10])()
复制代码如何来读懂这些函数声明呢?
首先我们对它们进行一些“格式化”:- void (*(*p)(
- void *(*) (char *, long , long )
- )
- )(char *, long , long);
复制代码- void (*tpsetunsol(
- void (_TMDLLENTRY *)(*disp)(char *data, long len, long flags)
- )
- )(char *data, long len, long flags);
复制代码- double (*
- (*
- (*fp)()
- )[10]
- )();
复制代码 然后掌握以下几点:
1. 括号()有两种作用:一是函数调用运算符,二是改变(默认的/原来的)结合顺序。
2. 记住括号作为函数调用运算符时,它的优先级要比 * 高。
3. 一个函数的声明,除了他的函数名和参数之外,剩余的就是它的返回值(类型)了。
4. 数组的成员访问运算符 [ ] 的优先级要比 * 高。
这种东西,一旦你掌握了方法,其实太简单不过了:
1) p是一个函数指针,p指向的函数的参数也是一个函数指针void *(*) (char *, long , long ),p指向的函数的返回值也是一个函数指针void (*)(char *, long , long);
2) tpsetunsol是一个函数,它的返回值为:void (*)(char, long, long),是一个函数指针。然后tpsetunsol函数的参数为:void (_TMDLLENTRY *)(*disp) (char *data, long len, long flags),参数的类型也是一个函数指针。
所以:tpsetunsol是一个参数和返回都是函数指针的函数。
3) fp是一个函数指针,fp指向的函数的返回值是一个数组指针(指向数组的指针),而数组指针指向的数组是“指针数组”(保存指针的数组),指针数组的大小为10,数组中的成员的类型是一个返回值为double的函数指针(指向函数的指针)。
另外:我们可以利用typedef来简化这样比较复杂的声明。类似于signal函数:- #include <signal.h>
- typedef void (*sighandler_t)(int);
- sighandler_t signal(int signum, sighandler_t handler);
复制代码
简化如下:- typedef void* (*FP1)(char *, long , long)
- typedef void (*FP2)(char *, long , long)
- FP2 (*p)(FP1 );
复制代码- typedef void (*disp_f)(char * data,long len,long flags)
- disp_f tpsetunsol(disp_f _TDMLLENTRY * disp);
复制代码- typedef double (*FP_DOUBLE)();
- typedef PF_DOUBLE (*P_ARRAY)[10];
- P_ARRAY (*fp)();
复制代码 注:
函数指针:指向函数的指针。比如 int (*pf)(int, int);
指针函数:返回指针的函数。比如 int *fp(int, int); 也可这样写 int* fp(int, int);
数组指针:执行数组的指针。比如 int (*p_array)[10];
指针数组:保存指针的数组。比如 int *arrray_p[10]; 也可这样写 int* array_p[10];
最后:
char (*(*x[3])())[5];
char *(*(*f(char *(*para)(char *)))[2])();
请试着解析它。
原文地址:http://blog.chinaunix.net/space.php?uid=25909722&do=blog&id=3022956
|
|