5-7共用体union

本文介绍了共用体union的定义、使用方法及其与结构体struct的区别。共用体内的成员共享同一内存空间,而结构体的成员各自独立。共用体的主要用途在于对同一内存单元进行多种解析。虽然可以用指针和类型转换替代,但共用体提供了一种更简洁、直观的解决方案。

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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非主流的豆瓣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值