【C语言】联合体-共用体 (union) 详解

什么是联合体

联合(union)是一种数据类型,它能在同一个内存空间中存储不同的数据类型(不是同时存储)其典型的用法是,设计一种表以存储既无规律、事先也不知道顺序的混合类型。使用联合类型的数组,其中的联合都大小相等,每个联合可以存储各种数据类型。。联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。


联合类型的定义

联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

//联合类型的声明
union Un
{
 char c;
 int i;
};
//联合变量的定义
union Un un;

联合体的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

union Un
{
	int i;
	char c;
};
union Un un;
int main()
{
	
	printf("%d\n", &(un.i));
	printf("%d\n", &(un.c));
	system("pause");
	return 0;
}

在这里插入图片描述
由此可见,i 和 c都在共用一块空间。

所以对于联合体来说同一时间只能使用一个,如果两个一起使用的话,他们共用同一块空间,改变一个,另外一个也会跟着改变,内存会被覆盖掉了。

  • 面试题:
  • 判断当前计算机的大小端存储

un联合体 占四个字节(下面会讲到如何计算),如果是 把i 赋成1 按照小端存放就是 01 00 00 00,在判断 u.c 是否等于1(char类型只读取一个字节数据,) 如果等于1 就是小端,反之就是大端存储

#include<stdio.h>
union Un
{
	int i;
	char c;
};
union Un un;
int main()
{
	un.i = 1;
	if (un.c == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

那联合体大小该如何计算呢?


联合大小的计算

  1. 联合的大小至少是最大成员的大小。
  2. 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
  3. 联合也是需要内存对齐的
  • 请看下面的例子:
#include<stdio.h>
#include<stdlib.h>
union Un1
{
 char c[5];
 int i;
};
union Un2
{
 short c[7];
 int i;
};
//下面输出的结果是什么?
int main
{
  printf("%d\n", sizeof(union Un1));
  printf("%d\n", sizeof(union Un2));
  return 0;
}
  • printf(“%d\n”, sizeof(union Un1));

在这里插入图片描述
答案是-> 8
因为要对齐最大对齐数整数倍,中间浪费了几个空间

  • printf(“%d\n”, sizeof(union Un2));

在这里插入图片描述
答案是-> 16


  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值