以下讲解都是在VS2012中进行试验的:
联合体和位域的使用都是以节省空间为目的。
联合体同stuct一样,联合默认方位权限也是共有的,并且,也具有成员函数。
共用体和结构体有以下区别:
1.共用体内存=MAX(各变量)
2.结构的内存=sizeof(各变量之和)+内存对齐
刚接触的union的人,大概只能记住“所有的公用体成员公用一个空间,并且同一时间只能存储其中一个成员变量的值”。这个就是Union的精髓之处。
比如:
简单联合的使用:
当我们在结构体中需要使用两个或者更多我们互斥的变量的时候,我们就可以将这些变量声明为一个联合体变量:
union {
int k; //吃饭了
int m; //吃晚饭了
int c; //吃早饭了
........
}un;
If(吃饭了)
{
我们出去溜达
}
这样我们就可以使用一个整型的空间来表示if中的条件,并且if条件中的表达是长度更短。
这种方式就会使我们的程序占用更少的空间发挥更大的作用。(四两拨千斤)并且提高了程序的可读性。
联合体和位运算联合起来一起使用:
union {
Struct {
unsigned char s1:3;
unsigned char s2:3;
unsigned char s3:2;
}infor;
unsigned char u;
}k;
当u=0x53的时候,s1,s2,s3等于多少?在不断的实验测试下,我得出了一下。
联合体k占有一个字节的空间。数据在内存中的分配情况如下表:(从左向右看)。u 的值为(01010011)0x53。
在内存中,一个地址指向一个字节的空间:
1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
当我们将(01010011)0x53放入内存中的时候,我们先放高位的再放低位的顺序依次是:
(内存中从右向左放)01010011。(汇编中有句话是:数据中的高位放在内存中高位上,数据中的低位存放在内存中的低位上)
在进行位分配的时候:s1指向的是左侧的三个位置(110),s2指向随后的三个位置(010),s3指向的是最后两个位置(10)。
读取数据的时候,将顺序颠倒:s1=011 s2=010 s3=01
总结:我们可以看到:s1对应的是u的低三位,s2对应的是中间三位,s3对应的是高两位。当联合体的空间大于一个字节的时候,我们也可以依据这个结论。
联合体的强转:
union{
Unsigned int n;
Char c;
}u;
u.n=0x30;
Printf(“%c”,c);
输出的 0 这样我们就可以实现数据的强制转换。在这里只是告诉你union可以实现数据类型的强制转换。