自定义类型:枚举与联合体

一.枚举 --- 顾名思义:就是一一列举

enum --- 枚举关键字 , enum后面的就是枚举标签名

然后是一个花括号加分号 ;

花括号内的是枚举类型的可能取值 --- 枚举常量(它们是常量!) --- 即通过枚举类型创建的变量能被赋予的值  --- 两个枚举常量之间用逗号隔开,只有自己的话不用加逗号

枚举类型中的枚举常量都是有值的

这是因为我们在枚举类型中给出的只是枚举常量名,这个常量名只能告诉计算机有这么一个常量,但是计算机不知道这个常量的具体值

如果我们没有手动初始化的话,计算机会按照从上到下的顺序将这些枚举常量值从0开始初始化

如果手动初始化的话则必须在枚举类型中初始化,初始化方式如下 

初始化规则是,如果我们初始化了a,而a后面的常量没有被手动初始化的话,则在a后面的值会自动初始化为a+1 ,(a+1)+1 ......(已经手动初始化的变量不受影响。)

需要注意的是,枚举常量的赋值初始化只能够在枚举类型中进行,而在枚举类型之外使用枚举常量时,它就是一个已经被赋值的只能读不能写的常量了。

自定义类型:枚举与联合体_第1张图片

枚举类型的逻辑  ---- 

其实就是我们先创建常量,然后给它一个名字使得它变为一个有意义的符号

自定义类型:枚举与联合体_第2张图片

枚举类型是一系列有限的数据的集合,通过枚举类型创建的变量只能够被赋值为枚举类型中已有的数据

 自定义类型:枚举与联合体_第3张图片

那么我们为什么要使用枚举呢?

自定义类型:枚举与联合体_第4张图片

 自定义类型:枚举与联合体_第5张图片

ps:常量在计算机中只会创建一次

1.枚举是什么? --- 是一个被命名的整型常数的集合

自定义类型:枚举与联合体_第6张图片

 自定义类型:枚举与联合体_第7张图片

1.枚举类型中的标识符是常量,且标识符常量本身由系统定义了一个表示序号的数值,在没有人工自定义的情况下,由上到下序号从0到1 --- 注意这里是给标识符常量系统定义了一个序号,而不是给他赋值,常量本身是不能被赋值的

标识符常量的类型是枚举类型

2.枚举变量只能够被赋值为自己对应的枚举类型中的标识符常量

标识符常量在进行比较,打印等操作时可以将其它看作它对应的序列号

3.注意标识符常量的序列号定义并没有修改标识符常量的值,只是加上了一个序列号

常量就是常量,是不可修改的

自定义类型:枚举与联合体_第8张图片

只要是类型都可以写在头文件中


联合(共用体)

联合也是一种特殊的自定义类型

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)

自定义类型:枚举与联合体_第9张图片

这个是联合体类型的创建

1.联合体关键字 union + 联合体标签名

2.经典花括号 + 分号 + 花括号内的联合体成员 

完成上面这两步后我们就成功的完成了一个联合体类型的定义

如果要找到一个联合体变量中的成员的话,方法就和结构体类型 --- 用点操作符(联合体/结构体变量)或者箭头操作符(指针)

自定义类型:枚举与联合体_第10张图片

 用操作符找到成员变量,并要取成员变量的地址的时候,先把操作符找成员这一个命令用括号括起来先执行,因为取地址符号的优先性大于点和箭头操作符

自定义类型:枚举与联合体_第11张图片

 为什么联合体变量与其成员变量,以及成员变量与成员变量之间公用一个地址呢?

自定义类型:枚举与联合体_第12张图片

这是因为联合体中的成员共用了同一内存空间 ,所以联合体也叫共用体

 联合体类型的大小至少是最大成员的大小,因为我们必须保证每一个联合体成员都能塞进联合体开创的空间中

联合体的初始化以及注意事项:

由于联合体的特点是其内部的成员共享内存空间,所以当我们初始化了一个联合体中成员变量时,其它的成员变量也就得到了对应的初始化值。

初始化格式如下

自定义类型:枚举与联合体_第13张图片

访问联合体中的成员变量的方式和结构体一致,都是用点操作符(通过变量名访问)或箭头操作符(通过装有联合体变量的的地址的指针访问)

 总之联合体的特点就是:联合体中的成员变量共用一块空间,改一个成员变量存储的数据就相当于改了其它成员变量存储的数据

联合体的作用:1.比较大小端字节序

比如当我们要判断1是大端还是小端的时候,我们可以创建一个联合体类型,然后放入一个char 和一个int类型变量

int类型变量中存入1,此时!!!由于联合体成员变量之间共享内存空间,所以当我们将1存入int变量中时,char变量自动获取存进int变量中的数据的第一个字节

有了这一个字节后,我们就能直接判断大小端了,如果这个字节的值等于1就是小端,等于0就是大端

自定义类型:枚举与联合体_第14张图片

借助共用空间的特性自动获得第一个字节,然后来判断大小端,真的是妙啊 

类型也有作用域 --- 如果在所有的花括号之外,则该类型的作用域是全局,否则的话作用域就是对应的花括号内


联合体大小的计算

2.当最大成员的大小不是最大对齐数的整数倍的时候,联合体内存的大小就要扩展到最大对齐数的整数倍(选能够创下成员的最小整数倍)

3.联合体的大小至少是最大成员的大小

4.联合体中的成员共享内存空间

自定义类型:枚举与联合体_第15张图片

比如这样一个联合体的内存大小是 8 

首先 char a[ 5 ] 的对齐数是1 --- 而装下这个数组需要5个字节的空间

  (ps:数组对齐数等于数组元素的对齐数,数组元素的对齐数等于数组元素类型的大小) 

int  --- 对齐数4,装下它要四个字节

5 > 4

所以联合体内存大小取5是不行的,要对齐到4的整数倍 --- 取 8 .

函数在被调用时可以不传参

你可能感兴趣的:(c语言学习,c语言)