【C语言】自定义类型之 --- 联合体(共用体)

文章介绍了C语言中的联合体类型,包括其定义、特点和大小计算。通过示例展示了如何使用联合体判断机器的大小端,同时提到了联合体在内存利用上的特殊性。此外,文章还提及了结构体和枚举作为C语言的其他自定义类型。
摘要由CSDN通过智能技术生成

  •   🧑‍🎓个人主页:简 料

  •   🏆所属专栏:C语言

  •   🏆个人社区:越努力越幸运社区

  •   🏆简       介:简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~


C/C++学习路线 (点击解锁)(●’◡’●)
❤️C语言
❤️初阶数据结构与算法
❤️C++
❤️高阶数据结构
❤️Linux系统编程与网络编程

前言

联合体(union)在C语言中是不常用的,不过存在就必然有其有用之处,这里不深入探讨联合体用在何处有什么用,本文章只介绍关于union的基本知识。

联合体(UNION)类型的定义

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

例如:

//联合体类型的声明
union Un   // union Un 为联合体类型
{
     // 公用空间的成员
	 char c;    
	 int i;
};
union Un
{
	char a[5];
	int b;
};  // 注意要有分号

联合体的特点

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

例如这里分别打印ic的地址,会发现他们的地址相同,这是因为他们公用同一块空间的地址:

#include <stdio.h>

union Un
{
	int i;
	char c;
};

union Un un;

int main()
{
	// 下面输出的结果是一样的吗?

	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c));

	return 0;
}

运行结果:

在这里插入图片描述
可以看到,他们两个的地址是相同的。

这是因为:

在这里插入图片描述

联合体大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
  • 假设这里默认对齐数为8。

例如:

#include <stdio.h>

union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};

int main()
{
	//下面输出的结果是什么?
	printf("%d\n", (int)sizeof(union Un1));
	printf("%d\n", (int)sizeof(union Un2));

	return 0;
}

在这里插入图片描述

联合体使用的典型例题 — 判断机器的大小端

在我之前的这篇http://t.csdn.cn/AKnbz博客中,已经介绍了大小端是什么,这里着重写联合体是怎么判断大小端的。

直接看代码实现:

#include <stdio.h>

union Un
{
	char a;
	int b;
};

//int sys_check();

int main()
{
	union Un u;
	u.b = 1;

	if (u.a == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	return 0;
}

在这里插入图片描述
运行结果:

在这里插入图片描述

可以看到,运用联合体判断出来vs是小端存储模式

调试后观察内存:

在这里插入图片描述
可以看到,的确为小端存储模式。

写在最后

  • 能够熟练掌握联合体,说不定,在以后的某个时间就用上了呢。
  • 到这里,C语言自定义类型的介绍结束了,一共有三大块:结构体类型枚举类型联合体类型
  • 以下是我写的结构体和枚举的博客链接,欢迎阅读噢:
    结构体http://t.csdn.cn/IRpyh
    枚举http://t.csdn.cn/aeh10

感谢阅读本小白的博客,错误的地方请严厉指出噢!

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

简 料

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

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

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

打赏作者

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

抵扣说明:

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

余额充值