C语言之联合体

 与结构体一样,联合体也是由多个成员组成,但是编译器只为最大的成员分配足够的空间,联合体的所有成员共用一块空间,所以联合体也叫共用体。

1.声明:类似结构体的声明,只是名字是union不是struct。声明并计算一下大小和打印地址:

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u = { 0 };
    printf("%zd\n", sizeof(u));

    printf("%p\n", &u);
    printf("%p\n", &(u.c));
    printf("%p\n", &(u.i));
	return 0;
}

由此也可以知道联合体内部成员共用一块地址,也就是说它们叠在了一起,所以同一时间只能使用一个成员,改了c的值i也会改,改了i的值c也会改。

2.大小:但其实联合体的总大小也得是最大成员对齐数的整数倍,就比如:

union Un
{
	char c[5];
	int i;
};

int main()
{
	union Un u = { 0 };
	printf("%zd\n", sizeof(u));
	
	return 0;
}

char类型是一个字节,与vs的默认对齐数相比较小,int类型是4个字节,所以最大的对齐数是4,由于联合体需要给最大的成员足够的内存空间,此时这个最大成员是char c[5],所以先给5个字节,然后还要是4的整数倍,所以就是8了。 

3.联合体的应用:

现有一个活动,要上线一个礼品兑换单,礼品兑换单有三种商品:图书、杯子、衬衫。

每一种商品都有:库存量、价格、商品类型和与商品类型相关的其他信息:

图书:书名、作者、页数

杯子:设计

衬衫:设计、可选颜色、可选尺寸

分类一下,每种商品都有的属性叫做公共属性,自己特有的叫特殊属性。如果把上述属性全部设计成一个结构体的话,空间会偏大,而且所有的属性不会同时出现,有一些特殊属性就会使用不到,造成空间的浪费,这时候可以配合联合体来设计。

struct gift_list
{
	int stock_number;//库存量
	double price;//定价
	int item_type;//商品类型

	union {
		struct
		{
			char title[20];//书名
			char author[20];//作者
			int num_pages;//页数
		}book;
		struct
		{
			char design[30];//设计
		}mug;
		struct
		{
			char design[30];//设计
			int colors;//颜色
			int sizes;//尺寸
		}shirt;
	}item;
};

把特殊属性用联合体包括起来,可以在一定程度上节省空间。

以上就是本节的全部内容了。

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值