3.6 构造类型数据
我们前面介绍的数据类型有字符型、整型、实型等,它们都属于基本的数据类型。C语言中还支持构造类型的数据,它是由基本数据类型按照一定的规则组合而成的,构造类型数据主要包括数组、结构体和共用体等。
3.6.1 数组
简单地说,数组就是同一类变量的有序集合。数组同普通变量一样,要先定义后使用,定义数组的方法如下:数据类型 数组名 [常量表达式] ;
定义数组时,“数据类型”是指数组中各个单元的类型,数组只能是同一类型的数据单元的集合;“数组名”是整个数组的标识,命名方法同变量命名方法相同;“常量表达式”表示数组中单元的个数,它必须用括号括起,括号里的数不能是变量,只能是常量。定义数组的方法可以参考以下代码: unsigned int count [10] ;
以上代码定义了无符号整型数组count,它有10个数据单元。在使用数组时,用数组名加下标的方法加以引用,具体方法可以参考以下代码:count [3] = X;
意思是将变量“X”的值赋给数组count的第四个元素。这里需要注意的是,数组的下标是从0开始的,“count[0]”就代表数组中的第一个数据单元,“count[9]”代表的是其最后的一个数据单元。我们也可以在定义数组的时候为其赋初值,定义这种数组的格式如下:
数据类型 数组名 [常量表达式] = { 常量表达式1,常量表达式2,…,常量表达式n };
在赋初值的数组中,方括号内的常量表达式是可以省略的,这时数组中数据单元的个数就由实际初值的个数决定。“{}”括号内是数组各单元的初值,两个初值间用逗号分隔。定义赋初值的数组可以参考以下代码:
unsigned char seg_table[ ]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
上面介绍的数组是一维的,数组也可以是多维的,关于多维数组在这里不做详细介绍,需要时可以参考C语言的相关书籍。
3.6.2 结构体
结构体是在一个统一的名称下,组合在一起的变量的集合。结构体中的每个变量都称为结构体的成员,每个成员之间的数据类型可以不同,结构体变量的总长度等于结构体中每个成员长度的总和。定义结构体的格式如下:
struct 结构体类型名
{
成员类型名 成员名1;
成员类型名 成员名2;
…
成员类型名 成员名n;
}变量名列表;
例如,我们要构建一个学生情况登记表,可以用下面的方法定义结构体:
struct student //结构体关键词及结构体名称
{
unsigned int num; //学号,结构体的成员1
unsigned char name; //名字,结构体的成员2
unsigned char age; //年龄,结构体的成员3
} student1, student2; //结构体变量名
在上面的结构体定义中,struct是结构体类型标识,是C语言的关键字。结构体的名称是student,这个结构体由3个成员构成,即num、name和age。“{}”结束后的student1、student2定义的是两个结构体变量,最后的“;”是结构体的类型定义结束符。 结构体不能与其他基础型的变量间相互赋值,对结构体变量的引用,包括赋值、运算等都是通过结构体变量的成员来实现的,引用上面定义的结构体变量成员的方法如下:
student1.num = 57;
student2.age = 16;
3.6.3 共用体
共用体与结构体有相似之处,但共用体的成员全部共用相同的存储空间,一个共用体变量的长度等于各成员中最长的成员长度。实际上,共用体是一个在不同时间保存不同类型数据的变量,这些不同类型的数据共用一个存储空间,赋入新值则会冲掉旧值。定义共用体的格式如下:
union 结构体类型名
{
类型说明符1 成员名1;
类型说明符2 成员名2;
…
类型说明符n 成员名n;
}变量名列表;
例如,我们要定义一个名称为number的共用体可以参考以下代码。
union number //共用体关键词和共用体名称
{
unsigned int a ; //共用体成员1
unsigned char b; //共用体成员2
float c; //共用体成员3
} u1,u2,u3; //共用体变量名
在这个共用体的类型定义中,union是共用体类型的标识,也是C语言的关键字。共用体的名称是number,这个共用体由3个成员构成,即a、b和c。“{}”结束后的u1、u2、u3定义的是3个共用体变量。共用体变量的成员在内存中占用同一首地址的空间,其引用方法如下:
u1.a=3457;
u1.b=215;
u3.c=12.634;
本章回顾
本章至此已经将C语言的基础知识部分进行了概括说明,阅读完本章内容,相信你对C语言及C程序的开发会有一个基本的认识。在使用Keil C51编译器为8051单片机开发C程序时, C51编译器会针对8051单片机的特点对编译器进行一些优化,本书将在后面的章节中对Keil C51编译器的特色部分进行介绍。