C语言绝对值得一看的常识讲解:自定义数据类型——枚举、结构体、共用体篇

本文介绍了C语言中枚举类型用于限制变量取值范围和增强可读性的特点,结构体类型用于组织复杂数据及其关联,以及共用体类型如何共享内存空间。详细讲解了它们的定义、初始化和操作方法。
摘要由CSDN通过智能技术生成

基本数据类型一般只能表示单一的数据,但是在实际问题中,数据之间常常是有联系的,为了能够描述更复杂的数据以及数据之间的联系,大多数程序设计语言都允许编程人员根据实际问题自定义数据类型,即我们在基本数据类型中提到的构造类型。前面我们讲了一种构造类型——数组,这里我们再把几种其他常用的构造类型和大家分享一下。

目录

1.可枚举数据的组织——枚举类型

1.1枚举类型的定义

1.2枚举变量的定义和初始化

1.2.1枚举变量的定义

1.2.2枚举变量的初始化

1.3枚举变量的优点

2.不同类型数据的组织——结构体类型

2.1结构体类型的定义

2.2结构体变量的定义和初始化

2.2.1结构体变量的定义

2.2.2结构体变量的初始化

2.3结构体变量的操作

2.3.1结构体变量的引用

2.3.2结构体变量的输入/输出

2.3.3赋值操作

 3.共用体

3.1共用体类型的定义

3.2共用体变量的定义和初始化

3.2.1共用体变量的定义

3.2.2共用体变量的初始化

3.3共用体变量的操作

3.3.1共用体变量的引用

3.3.2共用体变量的赋值


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共用体变量的赋值

内存单元中共用体变量的值,是最后一次装入成员的值。因为共用体变量的内存单元,只能被其中一个成员(即最后装入内存单元的成员)所占用。

共用体变量只能为其第一个成员初始化,所以初值表只能有一个值,如果初值表是多个值(即你想给每个成员都赋值,那样是错误的)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值