第 9章 Cx51 构造数据类型
本章讨论几种复杂的数据类型 — 构造型数据类型。它们是按照一定的规则由一系列元素类型组成的数据类型。其中元素类型又叫基类型,它给出构造型数据本身的类型,既可以是简单的,也可以是复杂的。
一定的规则体现为构造方法,而构造方法决定了如何访问一个元素。
复杂数据类型主要有数组、结构、联合和指针四种构造型数据类型。
9.1数组类型
数组类型一般由固定数量的同类元素所组成。其特点是数量确定,元素类型要相同。在 C语言中,
数组的元素类型主要是整数类型和字符类型,数组的维数主要是一维的,两维以上用得较少。
数组变量的说明通过说明语句来实现。
例如,数组变量 P(以后简称,数组 P”)是 10个整数的数组,通过如下说明语句来说名:
int P[10];
其中,P为数组变量的名称,不是数组类型的名称; int为数组的元素类型; 10为数组元素的个数。
这 10个元素分别表示如下:
P[0],P[1],P[2],P[3],P[4],P[5],
P[6],P[7],P[8],P[9]
其中,0,1,2,…,9表示数组元素的下标,n个元素的最小下标为 0,最大下标则为 n-1,而不是 n。数组的下标必须在方括号 [ ]之中。
9.2指针类型
在 C语言中,指针是一个变量,包含着另一个变量的地址。因此,通过指针可以间接地访问另一个变量。
为了熟悉指针定义,我们先看下列两个语句:
int x,*px;
px = &x;
前一个说明语句表示 x是一个整型变量,px
是一个指向整数的指针;后一个赋值语句表示将变量 x的地址赋给变量 px。其中 x是变量,& x表示
x的地址。单目运算符&是一个地址运算符,它用来产生一个变量的地址。
上述语句完成了由变量找地址的工作,下面的语句将完成由地址找内容的工作。
int x,y,*px;
px = & x;
y = *px;
上述程序段表示将 x的地址赋给 px,通过地址运算符来实现。 px作为 y的最终地址,px的内容就是 y的值,因此 y
就等于 x。
请注意:& x和 *x的意义是不相同的,其主要区别为:
&x中,x为变量,&x则为 x的地址;
*x中,x为地址,*x则为以 x为地址的那个对象的内容。
前者的 x通常为整数型变量,后者的 x必须是指针。
指针和整数可以进行加减运算,在这种情况下,
首先象加法运算讨论中所指出的那样进 行转换。
指向同一类型对象的两个指针可以相减,结果转换成整数,它表示处于两个指针所 指对象之间的对象的个数,但这种转换通常会产生不可预料的效果。如果两个指针是指向同 一个数组,那是有意义的。两个指针也可以比较,结果依赖于所指的对象在地址空间中的相 对位置。仅当几个指针指向同一数组的元素时,指针比较才是可取的。任何指针同 NULL(空指针)作相等与不等的比较都是有意义的。
Cx51 对指针变量进行了扩展,指针变量在 Cx51
中定义格式如下数据类型 [存储器类型 ] *标识符;
其中,,标识符,是所定义的指针变量名。
,数据类型,说明了该指针变量所指向的变量的类型。
,存储器类型,是可选项,它是 Cx51编译器的一种扩展,如果带有此选项,指针被定义为基于存储器的指针,无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用 3个字节,第一个字节存放该指针存储器类型的编码(由编译时编译模式的默认值确定),第二和第三个字节分别存放该指针的高位和低位地址偏移量。
9.3 结构类型
数组类型是由一定数量的相同类型的元素组成的。它严格地要求元素类型必须相同,然而,实际生活中有许多不同类型的元素具有共同的属主。因此,结构类型是很有用的。
例如,表示一个日期可由年、月、日组成,月份用英文缩写名称,则可以定义一个日期的结构:
struct date
{ int year,month,day;
char mon[ 3];
}
上面的描述表明定义了一个结构类型,其类型名称为
date
9.4联合类型
联合( union)也是一种类型,它可以在不同时间内拥有不同类型和不同长度的对象。
其目的是提供一个单一的变量,合理地保存几种类型中的任何一种变量,从而在一个存储区内管理不同类型的数据,达到节省存储空间的效果。
联合的语法是以结构为基础的。
我们先看一个联合的说明.
union u_tag
{
int ival;
float foal;
char *pval;
} uval;
其中:
union是联合的关键字 ;
u_tag是一种联合类型的名称 ;
uval是联合类型 u_tag的变量 ;
{ }是描述 u_tag类型可以保存的几种类型的变量。它们中的任何一种都可以赋给变量 uval。
变量 uval必须足以容纳最大的成员。被检索的类型必须是最近存储的类型。程序员的职责就是记录下当前存于联合中的类型是什么。
9.5枚举枚举数据类型是一个有名字的某些整数型常量的集合。
这些整数型常量是该类型变量可取的所有的合法值。枚举定义应当列出该类型变量的可取值。
一个完整的枚举定义说明语句的一般格式为
enum枚举名{枚举值列表}变量列表;
枚举的定义和说明也可以分成两句完成,即
enum枚举名{枚举值列表};
enum枚举名 变量列表;

enum day{ Sun,Mon,Tue,Wed,Thu,Fri,Sat}
d1,d2;

enum day{ Sun,Mon,Tue,Wed,Thu,Fri,
Sat};
enum day d1,d2;