一. union的声明和struct类似
1 union 名称 { 2 //成员变量 3 }; 4 5 typedef union { 6 //成员变量 7 }名字;
二. 内存分配
1. union内存大小需要满足以下2个条件:
1> 大于或等于union中最长的成员变量的长度;
2> 能整除其他成员变量长度
文字描述计算过程:U001中的成员变量 int number->4字节,char c[10]->10字节,double tmp->8字节, 要大于或等于10,还需要能整除4和8,U001的大小为16字节
2. union中的成员变量是不共存的,所有成员变量的起始地址相对于union基地址偏移量都是0,即union创建时分配的内存空间,所有的成员变量共用,新值会覆盖旧值
3. 判断union起始地址是低地址还是高地址
从Log可以看出c[0]地址小于c[1],所以在我的机子上,union起始地址是低地址,即小端little-endian
4. union怎么存储和读取成员变量的值
ASCII字符‘A’对应16进制41、10进制65,‘B’对应16进制42、10进制66,'C'对应16进制43、10进制67, 'D'对应16进制44、10进制68
char类型1个字节,int4个字节,给联合体实例u1的成员变量char c[10]前4个字节赋值,正好对应int的4个字节,
以16进制形式打印u1.number可以得到44434241,说明union的存取是这个样子的:
4-1> 创建出联合体实例u1后,u1的内存如下
4-2> 赋值u1.c[0] = 'A'; 成员变量char c[10]拥有10个字节长度,c[0]从低地址开始找到第1个字节即byte0, 赋值u1.c[0]后,内存变为:
4-3> 赋值u1.c[1] = 'B'; 从低地址开始找到第2个字节即byte1, 赋值u1.c[1]后,内存变为:
4-4> 赋值u1.c[2] = 'C'; 从低地址开始找到第3个字节即byte2, 赋值u1.c[2]后,内存变为:
4-5> 赋值u1.c[3] = 'D'; 从低地址开始找到第4个字节即byte3, 赋值u1.c[3]后,内存变为:
4-6> 读取u1.number, int类型4个字节,从低地址依次读取4个字节byte0 byte1 byte2 byte3,
将这4个字节按照从高地址到低地址排列组合为byte3 byte2 byte1 byte0
即 获取内存中字节时从低地址开始,将获取的字节从高地址到低地址排序,得到的值才是变量的值