Union联合体

一. union的声明和struct相似spa

 

1 union 名称 {
2     //成员变量
3 };
4 
5 typedef union {
6     //成员变量
7 }名字;

  

二. 内存分配3d

1. union内存大小须要知足如下2个条件:code

  1> 大于或等于union中最长的成员变量的长度;blog

  2> 能整除其余成员变量长度排序

文字描述计算过程:U001中的成员变量 int number->4字节,char c[10]->10字节,double tmp->8字节,  要大于或等于10,还须要能整除4和8,U001的大小为16字节内存

 

2. union中的成员变量是不共存的,全部成员变量的起始地址相对于union基地址偏移量都是0,即union建立时分配的内存空间,全部的成员变量共用,新值会覆盖旧值it

 

3. 判断union起始地址是低地址仍是高地址io

从Log能够看出c[0]地址小于c[1],因此在个人机子上,union起始地址是低地址,即小端little-endianclass

 

4. union怎么存储和读取成员变量的值变量

 

ASCII字符‘A’对应16进制4一、10进制65,‘B’对应16进制4二、10进制66,'C'对应16进制4三、10进制67, 'D'对应16进制4四、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

 

即 获取内存中字节时从低地址开始,将获取的字节从高地址到低地址排序,获得的值才是变量的值

相关文章
相关标签/搜索