位段的内存分配:
位段内存空间的计算规则:
1.位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
2.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
我们通过一个例子来了解一下位段的内存分配:
位段的跨平台问题:
1.位段包括unsigned int和signed int,是否有符号的这个问题没办法确定。(最高位是否为符号位)
2.位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题。
3.位段中,内存有低位向高位存储,还是有高位向低位存储不确定(没有确定是大端存储或者是小段存储)
4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的。
位段和结构体对比时,位段可以很好的节省空间,而结构体不可以,但是位段存在明显的跨平台问题!!!
枚举类型:
枚举如何定义:
我们来介绍一下枚举:
它成员和成员之间是用逗号,而结构体用分号
RED,GREEN,BLUE叫做枚举的可能取值,而结构体的成员叫做成员变量
这里RED,GREEN,BLUE是有对应数字的,分别对应0,1,2
枚举的可能取值因为是枚举常量,所以不允许更改,但可以在一开始初始化。例如:RED=5;
枚举的优点:
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
枚举的使用:
我们利用通讯录来了解一个枚举使用的好处:
我们正常会写一个函数(printf)来显示选择什么代表什什么,而我们运用枚举就可以避免这个问题,直接输入操作。
联合体(共用体):
联合体的定义:
跟结构体相同,没有什么区别:
联合体的每个变量共用同一个地址。
联合体的缺点:
但共用体有个缺点,如下图,不能同时使用c或b或者y,一次只能使用其中一个
联合体的内存大小:
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。