10.共用体union
10.1、共用体类型的定义、变量定义和使用
(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。
(2)共用体和结构体的不同:结构体类 似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。
(3)共用体union就是对同一块内存中存储的二进制的不同的理解方式。
(4)在有些书中把union翻译成联合(联合体),这个名字不好。现在翻译成共用体比较合适。
(5)union的sizeof测到的大小实际是union中各个元素里面占用内存最大的那个元素的大小。因为可以存的下这个就一定能够存的下其他的元素。
(6)union中的元素不存在内存对齐的问题,因为union中实际只有1个内存空间,都是从同一个地址开始的(开始地址就是整个union占有的内存空间的首地址),所以不涉及内存对齐。
#include <stdio.h>
//共用体类型的定义
struct mystruct
{
int a;
char b;
}
//共用体类型的定义
//a和b其实指向同一块内存空间,只是对这块内存空间的两种不同的解析方式
//如果我们使用u1.a,那么就按照int类型来解析这个内存空间;如果我们使用u1.b,那么就按照char类型来解析这个内存空间
union myuinon
{
int a;
char b;
}
int main(void)
{
//test1
struct mystruct s1;
si.a=23;
printf("s1.b=%d.\n",s1.b); //s1.b=0,结论是s1.a和s1.b是独立无关的,所以s1.b的值是随机的
//test2
union myunion u1; //共用体变量的定义
u1.a=23; //共用体元素的使用
printf("u1.b=%d.\n",u1.b); //u1.b=23,u1.b=u1.a,结论是u1.a和u1.b是相关的,
//结构体类型下,两者地址不一样,相差一个int类型的占据内存,4字节
printf("s1.a=%p.\n",&s1.a);
printf("s1.a=%p.\n",&s1.b);
//共用体类型下,两者地址一样,说明a和b指向同一内存空间,只是解析方式不一样
printf("u1.a=%p.\n",&u1.a);
printf("u1.b=%p.\n",&u1.b);
return 0;
}
10.2、共用体和结构体的相同和不同
(1)相同点就是操作语法几乎相同。
(2)不同点是本质上的不同。struct是多个独立元素(内存空间)打包在一起;union是一个元素(内存空间)的多种不同解析方式。
10.3、共用体的主要用途
(1)共用体就用在那种对同一个内存单元进行多种不同规则解析的这种情况下。
(2)C语言中其实是可以没有共用体的,用指针和强制类型转换可以替代共用体完成同样的功能,但是共用体的方式更简单、更便捷、更好理解。