Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1755411
  • 博文数量: 413
  • 博客积分: 8399
  • 博客等级: 中将
  • 技术积分: 4325
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-09 10:44
文章分类

全部博文(413)

文章存档

2015年(1)

2014年(18)

2013年(39)

2012年(163)

2011年(192)

分类: C/C++

2011-11-18 17:27:24

在CU的C/C++版上看到一些比较复杂的函数声明:
  1. void (*(*p) (void *(*) (char *, long , long ))) (char *, long , long);

  2. void (*tpsetunsol (void (_TMDLLENTRY *)(*disp) (char *data, long len, long flags))) (char *data, long len, long flags);

  3. void double (*(*(*fp)())[10])()

如何来读懂这些函数声明呢?
首先我们对它们进行一些“格式化”:
  1. void (*(*p)(
  2.              void *(*) (char *, long , long )
  3.            )
  4.      )(char *, long , long);
  1. void (*tpsetunsol(
  2.                   void (_TMDLLENTRY *)(*disp)(char *data, long len, long flags)
  3.                  )
  4.      )(char *data, long len, long flags);
  1. double (* 
  2.            (*
  3.                (*fp)()
  4.            )[10]
  5.        )();

然后掌握以下几点:
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函数:
  1. #include <signal.h>
  2. typedef void (*sighandler_t)(int);
  3. sighandler_t signal(int signum, sighandler_t handler);
简化如下:
  1. typedef void* (*FP1)(char *, long , long)
  2. typedef void (*FP2)(char *, long , long)

  3. FP2 (*p)(FP1 );
  1. typedef void (*disp_f)(char * data,long len,long flags)

  2. disp_f tpsetunsol(disp_f _TDMLLENTRY * disp);
  1. typedef double (*FP_DOUBLE)();
  2. typedef PF_DOUBLE (*P_ARRAY)[10];
  3. 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])();  
请试着解析它。

阅读(1579) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

digdeep1262011-11-19 19:55:23

有前途?最好前途和”钱途“都有。

☆彼岸★花开2011-11-19 19:13:28

恩,有前途