2.6 构造类型数据
我们前面介绍的数据有字符型、整型、实型等,它们都属于基本的数据类型。C语言中还支持构造类型的数据,它是由基本类型的数据按照一定的规则组合而成的,构造类型数据主要包括数组、结构体和共用体等。
2.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语言的相关书籍。
2.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;
2.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定义的是三个共用体变量。共用体变量的成员,在内存中占用同一首地址的空间,其引用方法如下:
u1.a=3457; u1.b=215; u3.c=12.634;