/*4.5.12.共用体union
4.5.12.1、共用体类型的定义、变量定义和使用
(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。
(2)共用体和结构体的不同:结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。
(3)共用体union就是对同一块内存中存储的二进制的不同的理解方式。
(4)在有些书中把union翻译成联合(联合体),这个名字不好。现在翻译成共用体比较合适。
(5)union的sizeof测到的大小实际是union中各个元素里面占用内存最大的那个元素的大小。因为可以存的下这个就一定能够存的下其他的元素。
(6)union中的元素不存在内存对齐的问题,因为union中实际只有1个内存空间,都是从同一个地址开始的(开始地址就是整个union占有的内存空间的首地址),所以不涉及内存对齐。
4.5.12.2、共用体和结构体的相同和不同
(1)相同点就是操作语法几乎相同。
(2)不同点是本质上的不同。struct是多个独立元素(内存空间)打包在一起;union是一个元素(内存空间)的多种不同解析方式。
4.5.12.3、共用体的主要用途
(1)共用体就用在那种对同一个内存单元进行多种不同规则解析的这种情况下。
(2)C语言中其实是可以没有共用体的,用指针和强制类型转换可以替代共用体完成同样的功能,但是共用体的方式更简单、更便捷、更好理解。
*/
//程序功能:测试共用体中成员存储地址/union成员所占字节数/union使用方法
#include<stdio.h>
union myunion //定义一个共用体类型
{
int a;
char b;
double c;
};
int main(void)
{
union myunion u1; //定义共用体变量
printf("union占用字节数:%d\n",sizeof(u1)); //结果为8,结构体所占字节大小为最长的那个类型大小
//测试a,b,c是否占用同一地址
printf("u1.a=%p\n",&u1.a);
printf("u1.b=%p\n",&u1.b);
printf("u1.c=%p\n",&u1.c); //结果全为为0xbfcac188,说明共用体中元素的存储地址是一样的
return 0;
}
union共用体详解
最新推荐文章于 2024-04-19 19:19:58 发布