共用体/联合体 的引入

概念

由一系列具有相同数据类型或者不同数据类型的数据组成的集合,数据互斥关系,共用体所有的成员共同使用一份内存空间,其中空间的大小是按照共用体成员中所占的最大的内存空间的成员的空间进行分配,即同一个内存空间存放类型不同,但不同类型的变量共享一块空间

与结构体的区别

1. 结构体元素有各自单独空间;共用体元素共享空间

2.结构体元素互不影响,共用体赋值会导致覆盖(共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉)

3.结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存,即由最大类型确定

代码展示

#include <stdio.h>

struct TestS
{
	int Data1;//第一个成员偏移量为0,大小为4的倍数,所以大小为4
	char Data2;//第二个成员偏移量等于第一个成员偏移量加上大小,即0+4=4,大小为1的倍数,所以大小为4
	int Data3;//第三个成员偏移量等于第二个成员偏移量加上大小,即4+1=5,大小为4的倍数,所以大小为8            //整个结构体大小为最后一个成员的偏移量加上大小,即8+4=12,大小为4的倍数,所以大小为12
};

union TestU
{
	int Data1;//结构体大小取决于数据类型最大的
	int Data2;
	char Data3;
};

int main()
{
	struct TestS t1;
	union TestU t2;
	
	printf("结构体t1的大小是%d\n",sizeof(t1));
	printf("共用体t2的大小是%d\n",sizeof(t2));
	putchar('\n');	
	
	t1.Data1 = 10;
	t1.Data2 = 'a';
	t1.Data3 = 20;
	
	printf("Data1:%p,%d\n",&t1.Data1,t1.Data1);//将结构体每个数值打印出来
	printf("Data2:%p,%d\n",&t1.Data2,t1.Data2);
	printf("Data3:%p,%d\n",&t1.Data3,t1.Data3);
	putchar('\n');
	
	t2.Data1 = 10;
	t2.Data2 = 20;
	t2.Data3 = 'a';
	
	printf("Data1:%p,%d\n",&t2.Data1,t2.Data1);//只打印a的ACSII码(覆盖)
	printf("Data1:%p,%d\n",&t2.Data1,t2.Data2);
	printf("Data1:%p,%d\n",&t2.Data1,t2.Data3);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值