基本数据类型一般只能表示单一的数据,但是在实际问题中,数据之间常常是有联系的,为了能够描述更复杂的数据以及数据之间的联系,大多数程序设计语言都允许编程人员根据实际问题自定义数据类型,即我们在基本数据类型中提到的构造类型。前面我们讲了一种构造类型——数组,这里我们再把几种其他常用的构造类型和大家分享一下。
目录
1.可枚举数据的组织——枚举类型
枚举顾名思义就是⼀⼀列举, 把可能的取值⼀⼀列举。在程序设计时,有时可能遇到某些变量只能在一个范围内取值的情况,例如,一周有7天,一年有12个月,性别有男女两种,等等。枚举类型,将变量的所有可能取值列举出来,一方面限定了变量的取值范围,另一方面也增强了程序的可读性。
1.1枚举类型的定义
枚举类型是根据问题需要,由编程人员自行定义的数据类型。因此,要先定义枚举类型,再定义相应的枚举变量。定义枚举类型的一般形式如下:
enum 枚举类型名 {枚举元素表};
其中,enum是枚举类型的关键字,枚举类型名是用户定义的类型标志符,enum和枚举类型名构成枚举类型的名称;枚举元素表是由逗号分隔的多个枚举元素组成,每个枚举元素可以看作是用户帝定义的整型字符常量,因此枚举元素也称为枚举常量。其中,其默认值按照定义的顺序依次为0,1,2……如果在定义时指定某个枚举元素的值(称为枚举值),其后面的枚举元素的枚举值依次加1。
1.2枚举变量的定义和初始化
1.2.1枚举变量的定义
数据类型只是一个模板,编译器变为数据类型分配内存空间。定义枚举类型并不进行内存分配,在定义枚举变量时才为变量进行内存分配。
定义枚举变量有两种模式。
①先定义枚举类型,再定义枚举变量,一般形式如下:
enum 枚举类型名 变量名列表;
enum 枚举类型名就是上面已经定义的枚举类型,是枚举类型的名称。在C语言中,enum不能省略;变量名列表由逗号分隔的变量名组成。
②在定义枚举类型的同时定义枚举变量,一般形式如下:
enum 枚举类型名
{
枚举元素表} 变量名列表;
其中,枚举类型名可以省略,但在此定义后无法再定义这个类型的其他枚举变量。(因为我们也不知道这个枚举类型的名字是什么,那还怎么用这个类型定义嘞)
1.2.2枚举变量的初始化
定义枚举变量后,编译器为枚举变量分配一段连续的内存空间,但是该枚举变量是值无定义的。可以在定义枚举变量时进行初始化,即为枚举变量赋初值。
初始化枚举常量有两种方式,对应定义枚举变量的两种形式。
①先定义枚举类型,再定义枚举变量并初始化,一般形式如下:
enum 枚举类型名 变量名 = 初值;
②在定义枚举类型的同时,定义枚举变量并初始化,一般形式如下:
enum 枚举类型名
{
枚举元素表} 变量名=初值;
其中,初值为枚举元素而不是枚举值,如果为多个枚举变量初始化,用逗号分隔。
C语言规定,在为枚举变量赋值时,只能将枚举元素赋给枚举变量,不能直接将枚举值赋给枚举变量,通常将枚举值进行强制性类型转换再赋值给枚举变量。
1.3枚举变量的优点
①增加代码的可读性和可维护性
②和#define定义的标识符⽐较枚举有类型检查,更加严谨。
③便于调试,预处理阶段会删除 #define 定义的符号
④使⽤⽅便,⼀次可以定义多个常量
⑤枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤
2.不同类型数据的组织——结构体类型
在实际应用中,一个数据往往由多个分量组成,每个分量描述了数据的某个属性,在概念上构成一个整体。可以用简单变量分别存储数据的各个分量信息,但是这些变量在内存中各自占用各自的存储单元,分散存储的变量没有体现各分量之间的关联关系。大多数程序设计语言提供结构体类型来描述来这类数据,将数据的各个分量定义为结构体的成员变量,所有成员在内存中连续存储,使得各个分量信息在存储上构成一个整体。
2.1结构体类型的定义
结构体类型是根据需要,由程序人员自行定义的数据类型。因此,要先定义结构体类型,再定义相应的结构体变量。定义结构类型的一般形式如下:
struct 结构体类型名
{
数据类型1 成员1;数据类型2 成员2;
……
数据类型n 成员n;
};
其中,struct是关键字,结构体类型名是用户定义的标识符,struct和结构体类型名构成构成结构体类型的名称;成员的数据类型、数量和顺序不限,且成员的数据类型可以是任意合法的数据类型。结构体类型定义必须以分号结尾。
在定义结构体类型时,成员是任意合法的数据类型(不局限于基本类型),如果成员的数据类型是已经定义的结构体类型,则构成结构体类型的嵌套定义。显然,在定义嵌套的结构体类型时,先定义成员的结构体类型,再定义主结构体类型。一般情况下,结构体的嵌套不超过三层。
2.2结构体变量的定义和初始化
结构体类型是用户自定义数据类型,与基本类型具有相同的地位和作用,可以出现在基本数据类型允许出现的任何地方。结构体类型只是一个模型,本身并不占用内存空间,只有在定义结构体变量时才为该变量分配内存空间。
2.2.1结构体变量的定义
定义结构体变量有两种形式。
①先定义结构体类型,再定义结构体变量,一般形式如下:
struct 结构体类型名 变量名列表;
其中,struct 结构体类型名是已定义的结构体类型,在标准C中,struct不能省略;变量名列表是用逗号分隔的变量名组成。
②在定义结构体类型的同时定义结构体变量,一般形式如下:
struct 结构体类型名
{
成员列表
} 变量名列表;
其中,结构体类型名也可以省略,但在此定义后无法再定义这个类型的其他变量。
2.2.2结构体变量的初始化
定义结构体变量后,编译器为结构体变量分配一段连续的内存空间,但是该结构体变量是值无定义的。可以在定义结构体变量时进行初始化,即为结构体变量赋初值。
初始化结构体变量有两种方式,对应定义结构体变量的两种形式。
①先定义结构体类型,再定义结构体变量并赋初值,一般形式如下:
struct 结构体类型名 变量名 = {初值列表};
②在定义结构体类型的同时,定义结构体变量并赋初值,一般形式如下:
struct 结构体类型名
{
成员列表
} 变量名 = {初值列表};
其中,初值列表是由用逗号分隔的初值组成,并且初值顺序与结构体类型定义中的成员顺序必须一一对应。
定义结构体变量并赋初值,如果提供的初值个数小于成员的个数,则其余成员被初始化为系统默认值:int型为0,char型为'\0',float型和double型为0.0,int型数组为{0},char型数组为"\0"。
2.3结构体变量的操作
在C语言中可以通过成员运算符“.”来引用结构体变量的某个成员
2.3.1结构体变量的引用
引用结构体某个成员,其一般形式如下
结构体变量名.成员名
"."是成员运算符,具有左结合性,作用就是引用结构体的某个成员。
2.3.2结构体变量的输入/输出
在C语言中,不能整体读入一个结构体变量,也不能整体输出一个结构体变量,只能对结构体变量的各个成员进行输入/输出操作。
2.3.3赋值操作
在程序中不能对结构体变量进行整体赋值,具体指不能像初始化那样整体赋值。
如果两个结构体变量的类型相同,可以将一个结构体变量的整体值赋给另一个结构体变量。
3.共用体
现实生活中,经常需要填写一些表格。比如,教师和学生填写访谈表时,“职业”一栏可分别填写为“教师”或“学生”。若要求把两个或更多个不同类型的数据记录到一个变量中。则需要使用共用体类型。
3.1共用体类型的定义
共用体类型是根据需要,由程序人员自行定义的数据类型。因此,要先定义共用体类型,再定义相应的共用体变量。定义结构类型的一般形式如下:
union 共用体类型名
{
数据类型1 成员1;数据类型2 成员2;
……
数据类型n 成员n;
};
其中,union是关键字,共用体类型名是用户定义的标识符,union和共用体类型名构成构成共用体类型的名称;成员的数据类型、数量和顺序不限,且成员的数据类型可以是任意合法的数据类型。共用体类型定义必须以分号结尾。
在定义共用体类型时,成员是任意合法的数据类型(不局限于基本类型)。
3.2共用体变量的定义和初始化
共用体类型是用户自定义数据类型,与基本类型具有相同的地位和作用,可以出现在基本数据类型允许出现的任何地方。共用体类型只是一个模型,本身并不占用内存空间,只有在定义结构体变量时才为该变量分配内存空间。
3.2.1共用体变量的定义
定义共用体变量有两种形式。
①先定义共用体类型,再定义共用体变量,一般形式如下:
union 共用体类型名 变量名列表;
其中,union 共用体类型名是已定义的共用体类型,在标准C中,union不能省略;变量名列表是用逗号分隔的变量名组成。
②在定义共用体类型的同时定义共用体变量,一般形式如下:
union 共用体类型名
{
成员列表
} 变量名列表;
其中,共用体类型名也可以省略,但在此定义后无法再定义这个类型的其他变量。
3.2.2共用体变量的初始化
定义共用体变量后,编译器为共用体变量分配一段共用的内存空间,但是该共用体变量是值无定义的。可以在定义共用体变量时进行初始化,即为共用体变量赋初值。
共用体变量有两种方式,对应定义共用体变量的两种形式。
①先定义共用体类型,再定义共用体变量并赋初值,一般形式如下:
union 共用体类型名 变量名 = 初值;
②在定义共用体类型的同时,定义共用体变量并赋初值,一般形式如下:
union 共用体类型名
{
成员列表
} 变量名 = 初值;
共用体的各个成员,刻画了相应共用体变量的内在形式,即每一个共用体变量,都是具有这种共用体类型的结构。
共用体变量在内存中存放时,共用体变量的各个成员共用一段内存单元。因此,该内存单元中,在同一时刻,只能存放其中一个成员的值。
3.3共用体变量的操作
在C语言中可以通过成员运算符“.”来引用共用体变量的某个成员
3.3.1共用体变量的引用
引用共用体某个成员,其一般形式如下
共用体变量名.成员名
"."是成员运算符,具有左结合性,作用就是引用共用体的某个成员。
3.3.2共用体变量的赋值
内存单元中共用体变量的值,是最后一次装入成员的值。因为共用体变量的内存单元,只能被其中一个成员(即最后装入内存单元的成员)所占用。
共用体变量只能为其第一个成员初始化,所以初值表只能有一个值,如果初值表是多个值(即你想给每个成员都赋值,那样是错误的)。