enum --- 枚举关键字 , enum后面的就是枚举标签名
然后是一个花括号加分号 ;
花括号内的是枚举类型的可能取值 --- 枚举常量(它们是常量!) --- 即通过枚举类型创建的变量能被赋予的值 --- 两个枚举常量之间用逗号隔开,只有自己的话不用加逗号
枚举类型中的枚举常量都是有值的
这是因为我们在枚举类型中给出的只是枚举常量名,这个常量名只能告诉计算机有这么一个常量,但是计算机不知道这个常量的具体值
如果我们没有手动初始化的话,计算机会按照从上到下的顺序将这些枚举常量值从0开始初始化
如果手动初始化的话则必须在枚举类型中初始化,初始化方式如下
初始化规则是,如果我们初始化了a,而a后面的常量没有被手动初始化的话,则在a后面的值会自动初始化为a+1 ,(a+1)+1 ......(已经手动初始化的变量不受影响。)
需要注意的是,枚举常量的赋值初始化只能够在枚举类型中进行,而在枚举类型之外使用枚举常量时,它就是一个已经被赋值的只能读不能写的常量了。
枚举类型的逻辑 ----
其实就是我们先创建常量,然后给它一个名字使得它变为一个有意义的符号
枚举类型是一系列有限的数据的集合,通过枚举类型创建的变量只能够被赋值为枚举类型中已有的数据
那么我们为什么要使用枚举呢?
ps:常量在计算机中只会创建一次
1.枚举是什么? --- 是一个被命名的整型常数的集合
1.枚举类型中的标识符是常量,且标识符常量本身由系统定义了一个表示序号的数值,在没有人工自定义的情况下,由上到下序号从0到1 --- 注意这里是给标识符常量系统定义了一个序号,而不是给他赋值,常量本身是不能被赋值的
标识符常量的类型是枚举类型
2.枚举变量只能够被赋值为自己对应的枚举类型中的标识符常量
标识符常量在进行比较,打印等操作时可以将其它看作它对应的序列号
3.注意标识符常量的序列号定义并没有修改标识符常量的值,只是加上了一个序列号
常量就是常量,是不可修改的
只要是类型都可以写在头文件中
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
这个是联合体类型的创建
1.联合体关键字 union + 联合体标签名
2.经典花括号 + 分号 + 花括号内的联合体成员
完成上面这两步后我们就成功的完成了一个联合体类型的定义
如果要找到一个联合体变量中的成员的话,方法就和结构体类型 --- 用点操作符(联合体/结构体变量)或者箭头操作符(指针)
用操作符找到成员变量,并要取成员变量的地址的时候,先把操作符找成员这一个命令用括号括起来先执行,因为取地址符号的优先性大于点和箭头操作符
为什么联合体变量与其成员变量,以及成员变量与成员变量之间公用一个地址呢?
这是因为联合体中的成员共用了同一内存空间 ,所以联合体也叫共用体
联合体类型的大小至少是最大成员的大小,因为我们必须保证每一个联合体成员都能塞进联合体开创的空间中
联合体的初始化以及注意事项:
由于联合体的特点是其内部的成员共享内存空间,所以当我们初始化了一个联合体中成员变量时,其它的成员变量也就得到了对应的初始化值。
初始化格式如下
访问联合体中的成员变量的方式和结构体一致,都是用点操作符(通过变量名访问)或箭头操作符(通过装有联合体变量的的地址的指针访问)
总之联合体的特点就是:联合体中的成员变量共用一块空间,改一个成员变量存储的数据就相当于改了其它成员变量存储的数据
联合体的作用:1.比较大小端字节序
比如当我们要判断1是大端还是小端的时候,我们可以创建一个联合体类型,然后放入一个char 和一个int类型变量
int类型变量中存入1,此时!!!由于联合体成员变量之间共享内存空间,所以当我们将1存入int变量中时,char变量自动获取存进int变量中的数据的第一个字节
有了这一个字节后,我们就能直接判断大小端了,如果这个字节的值等于1就是小端,等于0就是大端
借助共用空间的特性自动获得第一个字节,然后来判断大小端,真的是妙啊
类型也有作用域 --- 如果在所有的花括号之外,则该类型的作用域是全局,否则的话作用域就是对应的花括号内
2.当最大成员的大小不是最大对齐数的整数倍的时候,联合体内存的大小就要扩展到最大对齐数的整数倍(选能够创下成员的最小整数倍)
3.联合体的大小至少是最大成员的大小
4.联合体中的成员共享内存空间
比如这样一个联合体的内存大小是 8
首先 char a[ 5 ] 的对齐数是1 --- 而装下这个数组需要5个字节的空间
(ps:数组对齐数等于数组元素的对齐数,数组元素的对齐数等于数组元素类型的大小)
int --- 对齐数4,装下它要四个字节
5 > 4
所以联合体内存大小取5是不行的,要对齐到4的整数倍 --- 取 8 .
函数在被调用时可以不传参