在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])();
请试着解析它。
阅读(1632) | 评论(2) | 转发(0) |