C语言联合体详解

下午好诶,今天小眼神给大家带来一篇C语言联合体详解的文章~

目录

联合体

1.  联合体类型的声明

 2.  联合体的特点

代码一: 

代码二:

 3.  相同成员的结构体和联合体对比

​编辑4.  联合体大小的计算 

 5.  联合体的优点

联合体

1.  联合体类型的声明

与我们之前学的结构体很相似,联合体也是由一个或者多个成员组成的,并且成员之间的类型可以不同

联合体与结构体不同的是,联合体的组成成员所占用内存空间是同一块内存空间,并且,编译器只为最大的成员分配足够多的内存空间,所以联合体也叫做:共用体

若是

给联合体其中一个成员赋值,其他成员的数值也会跟着变化。

#include<stdio.h>
union Un
{
	char a;
	int i;
};
int main()
{
	union Un un = { 0 };
	printf("%d\n", sizeof(un));//4
	return 0;
}

 输出结果: 4

 如果是结构体,这里应该输出结果为8,但结构体内成员共用一块空间,只为最大的成员分配足够多的内存空间,所以这里只给 i 分配了4个空间,a存储在 i 的空间中。

 2.  联合体的特点

联合体成员共用一个内存空间,那么一定要保证最大的成员要装下,所以,这样的联合变量的大小,至少是最大成员的大小(因为联合体至少有能力保存最大的那个成员)

代码一: 

#include<stdio.h>
union Un
{
	char a;
	int i;
};
int main()
{
	union Un un = { 0 };
	printf("%d\n", sizeof(un));//4
	printf("%d\n", sizeof(un.a));//1
	printf("%d\n", sizeof(un.i));//4
	printf("%p\n", &un);
	printf("%p\n", &(un.a));
	printf("%p\n", &(un.i));
	return 0;
}

输出结果:

4
1
4
0078FDF4
0078FDF4
0078FDF4

那么我们可以看到,联合体及其各个成员们的地址都是一样的,那么我们可以推测,是否所有的非最大成员都在首地址处存放呢?

代码二:

#include<stdio.h>
union Un
{
	char a;
	int i;
};
int main()
{
	union Un un = { 0 };
	un.i = 0x11223344;
	un.a = 0x55;
	printf("%x\n", un.i);
	return 0;
}

让我们调试上述代码来看看: 


通过内存监视,我们可以发现:的第四个字节内容被修改成 55 了,我们可以分析出以下 un 的内存布局图:

 3.  相同成员的结构体和联合体对比

union S
{
	char a;
	int i;
};
struct S s = { 0 };

struct Un
{
	char a;
	int i;
};
struct Un un = { 0 };

相同成员的情况下,结构体和联合体的内存分布情况:

 结构体和联合体的内存对比

4.  联合体大小的计算 

1.  联合体的大小至少是成员的大小

2.  当最大成员大小不是对齐数的整数倍的时候,就要将最大成员大小对齐到最大对齐数的整数倍。

#include<stdio.h>
union S1
{
	char a[5];
	int i;
};
union S2
{
	short c[7];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union S1));
	printf("%d\n", sizeof(union S2));
	return 0;
}

 5.  联合体的优点

使用联合体是可以节省空间的,例如我们要统计三种商品数据:图书,杯子,衬衫。

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

图书:书名、作者、页数

杯子:设计

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

 如果我们用结构体来写的话:

#include<stdio.h>
struct my_list
{
	int stock_number;//库存量
	double price;//价格
	int item_type;//商品类型

	char title[20];//书名
	char author[20];//作者
	int num_pages;//页数

	char design[30];//设计
	int colors;//颜色
	int sizes;//尺寸
};

上述结构设计简单用起来方便,但结构的设计中包含了所有商品的各种属性,这样会使得结构体的大小过大,很浪费内存。因为对于各自商品,只有部分属性信息是常用的:

商品是图书,就不需要design、colors、sizes。

所以,我们可以把公共属性单独写出来,用联合体把各种商品本身的属性括起来,这样可以在一定程度上节省内存

#include<stdio.h>
struct my_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
		{
			int colors;//颜色
			int sizes;//尺寸
		}shirt;

	}item;
};

 感谢阅读本篇文章

 希望能对您解题有所帮助,记得点赞关注收藏 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值