1.联合体(共用体)
<1>联合体的定义
联合体是一种比较特殊的自定义类型,它其中的成员公用一块内存。
他的声明和结构体大体相似:
要用到关键字union,其余和结构体的定义没什么区别。
<2>联合体的特点
联合体的最大特点就是,多个成员公用一块空间。
下面演示一下为什么:
可以看到,a和b的地址是同一个地址,而且这个联合体的大小是四个字节,说明这两个成员公用一块空间。那么有个问题,改变这个地址上的成员时,是不是两个都会改变呢,是这样的,所以我们在使用时是不能同时使用这两个成员的。
这种自定义形式起始也在一定程度上节省了空间,但是这通常使用在成员不需要同时出现的情况下,使用的频率还是没有结构体高。
<3>如何计算联合体的内存大小
由于成员公用一块内存空间,所以联合体的内存大小知道是最大的那个成员的内存大小。联合体的内存大小是最大对齐数的整数倍,如果不是最大对齐数的整数倍时需要对齐到最大对齐数的整数倍(类似于像成员中有数组时,有时候需要用对齐来计算)。
<4>简单使用联合体
我们用联合体来解决如何判断当前电脑时大端存贮类型还是小端存储类型。
这就巧妙的运用了结构体成员公用一块空间的特点。
2.枚举类型
<1>枚举类型的定义;
需要用到关键字enum,大括号内的内容是枚举类型的可能取值,,也叫枚举常量。
如图所示我们就简单的定义的一个枚举类型了。可以发现它和struct还是特别相似的,但也有细小地方处的 不同。在例子中,num sex的作用就和下面的int是一个意思。
--->关于枚举类型的初始化:
在没有初始化时就如上图所示时,第一个元素默认赋值为0,然后后面的成员按照第一个数字的大小依次加1,我们可以用printf("%d\n",FEMALE);这个语句来检验一下是不是这样的。我们也可以自己给这个类型里面的成员一一赋值:
就像上图一样,对每个一一赋值,如果我们仅仅对MALE进行赋值,那么FEMALE的值会根据上一个数赋值增加一来作为自己的取值,有多个元素时是同理的。
<2>枚举的优点
枚举主要是用来定义一些常量,就像#define一样的功能。
(1)增加代码的可读性,以及可维护性。
(2)和#define定义的标识符比较起来枚举有类型检查,更加严谨。
(3)防止了名字污染。
(4)便于调试.
(5)使用方便,可以一次性定义多个变量。
<3>枚举的使用
如下图举例:
枚举在后续的编程中会起到很大的帮助,是一个很好的工具。