5.7.1 共用体类型的定义、变量定义和使用
(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。
(2)共用体和结构体的不同:结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。
(3)共用体union就是对同一块内存中存储的二进制的不同的理解方式。
(4)在有些书中把union翻译成联合(联合体),这个名字不好。现在翻译成共用体比较合适。
(5)union的sizeof测到的大小实际是union中各个元素里面占用内存最大的那个元素的大小。因为可以存的下这个一定能够存的下其它的元素。
(6)union中的元素不存在内存对齐的问题,因为union中实际只有1个内存空间,都是从同一个地址开始的(开始地址就是整个union占有的内存空间的首地址),所以不涉及内存对齐。
#include <stdio.h>
//a和b其实指向同一块内存空间,只是对这块内存空间的2种不同的解析方式。
//如果我们使用u1.a,那么就按照int类型来解析这个内存空间;如果我们使用u1.b,
//那么就按照char类型来解析这块内存空间。
typedef union myunion
{
int a;
char b;
double c;
}myunion;
struct mystruct
{
int a;
char b;
};
int main(void)
{
//test1
struct mystruct s1;
s1.a = 23;
printf("s1.b = %d\n",s1.b);//-2,结论是s1.a和s1.b是独立无关的
printf("&s1.a = %p\n",&s1.a);//&s1.a = 0x7ffd3ca6a430
printf("&s1.b = %p\n",&s1.b);//&s1.b = 0x7ffd3ca6a434
union myunion u1; //共用体变量的定义
u1.a = 120; //共用体元素的使用
printf("u1.b = %d\n",u1.b);//23,结论是u1.a和u1.b是相关的
//a和b的地址一样,充分说明a和b指向同一块内存,只是对这块内存的不同解析规则
printf("&u1.a = %p\n",&u1.a);//&u1.a = 0x7fffb4bb3650
printf("&u1.b = %p\n",&u1.b);//&u1.b = 0x7fffb4bb3650
printf("sizeof(myunion) is %d\n",sizeof(myunion));//8
return 0;
}
5.7.2 共用体和结构体的相同和不同
(1)相同点就是操作语法几乎相同。
(2)不同点是本质上的不同:struct是多个独立元素(内存空间)打包在一起;union是一个元素(内存空间)的多种不同解析方式。
5.7.3 共用体的主要用途
(1)共用体就用在那种对同一个内存单元进行多种不同规则解析的这种情况下。
(2)C语言中其实是可以没有共用体的,用指针和强制类型转换可以替代共用体完成同样的功能,但是共用体的方式更简单、更便捷、更好理解。
#include <stdio.h>
union test
{
int a;
float b;
};
int main(void)
{
union test t1;
t1.a= 1123477881;
printf("value = %f\n",t1.b);
int a = 1123477881;
printf("指针方式:%f\n",*((float *)&a));//指针方式完全能代替共用体
return 0;
}
本文介绍了共用体union的定义、使用方法及其与结构体struct的区别。共用体内的成员共享同一内存空间,而结构体的成员各自独立。共用体的主要用途在于对同一内存单元进行多种解析。虽然可以用指针和类型转换替代,但共用体提供了一种更简洁、直观的解决方案。
1898

被折叠的 条评论
为什么被折叠?



