数据类型另思

     C语言中包括了丰富的数据类型,包括了声明中显式定义的类型和用做表达式中间类型的导出类型。例如:

     int  *p, x;

     *p = x;

     从这里我们可以知道x的地址类型(它的左值)是一个指向整数的指针。x值的类型(它的右值)是一个整数。

     C语言的类型其实可以用前缀形式表示,什么是前缀形式呢,看下面的例子:

     我们用一个表达式: a + b*c - (d + e) ,对于这样的表达式好像都熟悉,它就是所谓的中缀表达式

     它的前缀表达式是: -+a*bc+de;求解过程就不详述了,但有一点就是,我们可以看到前缀表达式操作数在操作符之后

     同样我们可以把C语言的类型定义为类型操作符和类型操作数的结合,而我们平时所看到的则是这种定义的“中缀表达式”,再回到刚才的例子,

int  *p 声明了p是指向int的一个指针,所以这里int *,指针是操作符,int是操作数.

     我们再看一个例子: char *(*strings)[10].

     如果根据《C专家编程》里讲的,我想你很快就会明白这个声明的含义, 我们根据此书里的步骤分析一下:

    

     通过上面的分析,可以知道: strings是一个指针,指向一个大小为10为数组,每个数组元素是一个指针,指向字符的指针.

     其实如果把它表示为前缀的形式,该是什么样的呢:

     (POINTER (ARRAY 10 ( POINTER (CHAR) ) ) )

     其中POINTER为操作符,剩下的为它的操作数,以此类推,ARRAY也为操作符,剩下的是它的操作数,等等。

    上面所说的POINTER,ARRAY,CHAR等都是类型操作符的编码,这些操作符所带有的操作数是不同的,下面首先列出所有的操作符编码:

    CHAR             LONG         ARRAY          FUNCTION         INT             ENUM            STRUCT           CONST

    UNSIGNED   FLOAT        UNION           VOLATILE           SHORT     DOUBLE        POINTER         VOID

    其中操作符CHAR, INT, UNSIGNED, SHORT, LONG ,ENUM定义了整数类型,FLOAT, DOUBLE定义了浮点类型,这些类型都为算术类型,除了ENUM以外,其他的都没有操作数. ARRAY, STRUCT, UNION为聚合类型,STRUCT和UNION没有操作数,ARRAY的操作数是数组元素的类型;POINTER和FUNCTION分别定义为指针类型和函数类型,它们的操作数分别指明被引用类型和返回类型.

    下面举个例子:

     (ARRAY  40 (INT  4  ) )

     它的实际表示就是 int a[40];

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值