对于C语言中的声明,我们习惯于从左往右读,这对于简单的情况往往行之有效,但对于复杂的情况则可能产生混淆,特别是使用了太多的圆括号。
如下所示的两个声明:
int *f( ); /* f: function returning pointer to int */
int (*pf)( ); /* pf: pointer to function returning int */
这两个声明的差别在于:*是一个前缀运算符(prefix operator),其优先级低于( ),所以后一个声明中必须使用圆括号以使运算分量能够正确的结合。
第一个声明中的*可以紧跟在int的后面,如:int* f( ); 其表示的含义跟int *f( )是一样的。这如同我们在声明变量时使用int *p和int* p一样。不过C语言推荐第一种写法,即*紧跟在变量或函数名之前,当我们定义多个变量时,第二种写法会带来混淆。
比如有如下所示的两个声明:
int *a, *b; /* a,b is both the pointer to int */
int* a, b; /* a: pointer to int b: int */
以下是《The C Programming Language》一书中讲到的一些声明:
char **argv
argv: pointer to char
int (*daytab)[13]
daytab: pointer to array[13] of int
int *daytab[13]
daytab: array[13] of pointer to int
void *comp( )
comp: function returning pointer to void
void (*comp)( )
comp: pointer to function returning void
char (*(*x())[])( )
x: function returning pointer to array[] of pointer to function returning char
char (*(*x[3])( ))[5]
x: array[3] of pointer to function returnging pointer to array[5] of char
对于这些复杂的声明,我们可以使用typedef创建一些新的类型。
使用typedef不仅可以使代码看上去整洁美观外,还有两个主要原因:第一,使程序参数化,以提高程序的可移植性。如果typedef说明的数据类型依赖于机器,那么当程序移植到其他机器上时,只需改变typedef类型定义;第二,用typedef定义可以为程序提供更好的文档,使一些复杂结构的类型更容易理解。
参考文献
The C Programming Language (second edition)