共用体union

18.共用体union:就是对同一块内存中存储的二进制的不同理解而已。
1.结构体类似一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,它们只是被打包成一个整体叫做结构体而已;结构体的变量是同时存在的;但是共用体不是这样,共用体中的各个成员其实是一体的,在这么多个成员中,同一时刻只能是其中的某一个成员存在,有时候是这个元素,有时候是另外一个元素,也可以理解为在同一个空间里,这时刻内存空间里放的是饼干,下一时刻放的是糖果,但是饼干和糖果只能有一个存在。
2.共用体中sizeof测到的大小实际是union中各个元素里面占用内存最大哦的那个元素的大小而已,因为可以保证能够存下所有该union共用体中的所有类型。
3.union中的元素不存在内存对齐的问题,因为union中实际只有1个内存空间,都是从同一个地址开始的(开始地址就是整个union占有的内存空间的首地址),所以不涉及内存对齐。
union myunion
{
int a;
char b;
};
int main(void)
{
union myunion u1;
u1.a = 23;
printf("u1.b = %d.\n", u1.b); //u1.b = 23,因为u1.a和u1.b的地址是一样的,说明a和b指向同一块内存,只是对内存的不同解析规则不一样。
//&u1.a和&u1.b的地址是一样的。
printf("a = %p.\n", &u1.a);
printf("b = %p.\n", &u1.b);

printf("sizeof(u1) = %d.\n", sizeof(u1));
printf("sizeof(u1.a) = %ld.\n", sizeof(u1.a));
printf("sizeof(u1.b) = %d.\n", sizeof(u1.b));
}


用途:
共用体就用在那种对同一个内存单元进行多种不同规则解析的这种情况下。
C语言中其实是可以没有共用体的,用指针和强制类型转换可以替换共用体完成同样的功能,但是共用体的方式更简单、更便捷、更好理解。

猜你喜欢

转载自blog.csdn.net/qq_20725221/article/details/51477166