复杂的声明(Complicated Declarations)

         对于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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值