Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言——联合体类型

C语言——联合体类型

作者头像
用户11029137
发布于 2024-03-19 07:49:55
发布于 2024-03-19 07:49:55
28900
代码可运行
举报
文章被收录于专栏:编程学习编程学习
运行总次数:0
代码可运行

一,什么是联合体

联合体也称共用体 像结构体一样,联合体也是由一个或者多个成员构成,这些成员的类型可以不同。但是,与结构体不同的是:联合体的所有成员共用一块内存空间。(即:给联合体其中的一个成员赋值,其他成员的值也会跟着被改变)

二,联合体的声明

1,联合体类型的声明

C语言中联合体类型的定义形式: union 联合体名 { 成员项表列 };

例如: (我们定义一个同时由char和int型构成的联合体)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
union Un
{
   char c;
   int i;
}; (注意:分号不能丢)

2,联合体变量的创建

同结构体变量的创建类似,我们可以在声明联合体类型的同时创建变量;也可以在声明后,再创建变量 如: (1)先声明联合体类型,再创建变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
union Un
{
	char c;
	int i;
};
union Un u1;

(2)在声明联合体类型的同时创建变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
union Un
{
	char c;
	int i;
}u1;

对联合体成员的引用也与对结构体成员的引用相同

三,联合体的特点

1,联合体与结构体的对比

联合体的大部分与结构体相似,其独特之处就是所有成员共用一块内存空间 例如,我们看拥有相同成员的结构体和联合体对比:

对于s1 和 u1的内存分配情况应该是:

我们可以用sizeof算一算,看看结果: 运行下面代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	printf("%d\n", sizeof(s1));
	printf("%d\n", sizeof(u1));
	return 0;
}

输出:

可以发现:和我们上面的分析一样

2,对联合体成员进行改变

下面我们就对联合体u1中的成员c进行赋值,然后再打印成员i

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
union Un
{
	char c;
	int i;
}u1;
int main()
{
	u1.c = 1;
	printf("%d", u1.i);
	return 0;
}

运行结果:

可见:尽管没有给成员i赋值,但是随着成员c被修改成员i的值也发生了变化

四,联合体的大小

上面提到的联合体u1的大小是4,刚好是当中最大的int类型的大小,难道联合体的大小就是其中最大成员的大小吗? 答案是:错误的 因为联合体的大小也要满足是最大对齐数的整数倍

⭐换句话来说,联合体的大小要满足以下两个条件: 1,大于或等于最大的成员(至少要能装下最大的成员) 2,同时是最大对齐数的整数倍

对于上面的u1: 最大成员:int类型的大小是4 而int的最大对齐数也是4,所以联合体u1的大小是4

再看下面的代码(多加一个字符数组):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
union Un
{
	char c;
	int i;
	char arr[6];
}u1;
int main()
{
	u1.c = 1;
	printf("%d",sizeof(u1));
	return 0;
}

运行结果:

这是因为: 1,最大成员char arr[6]的大小是6 2,最大对齐数是4 6不是4的倍数,所以扩宽到8,所以联合体的大小是8

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
杂谈c语言——4.结构体和联合体
    各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
hope kc
2024/09/23
930
杂谈c语言——4.结构体和联合体
C语言学习系列->联合体and枚举
联合体也是自定义类型,关键字为union,特点是所有成员共⽤同⼀块内存空间,因此,联合体也叫做共用体。
南桥
2024/01/26
1120
C语言学习系列->联合体and枚举
【C语言】联合体和枚举
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。
用户11290673
2024/09/25
1140
【C语言】联合体和枚举
轻松拿捏C语言——自定义类型之【联合体与枚举】
在union Un1中成员有两个,char c[5]占5个字节大小,在vs中1<8,所以char的对齐数为1,int i占4个字节大小,在vs中4<8,所以int类型对齐数为4, 所以在union Un1中最大对齐数为4。
用户11162265
2024/06/14
1620
轻松拿捏C语言——自定义类型之【联合体与枚举】
深入理解 C 语言中的联合体
联合体(union)是 C 语言中的一种特殊数据结构,允许在同一内存位置存储不同类型的数据。它与结构体(struct)类似,但存在显著的差异。理解联合体的定义、基本用法、优势、存储细节及其高级用法,有助于在实际编程中有效地使用这一数据结构。
平凡之路.
2024/10/09
7630
深入理解 C 语言中的联合体
C语言——自定义类型之联合体
联合体类型定义的变量包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
摘星
2023/04/28
3280
C语言——自定义类型之联合体
联合体类型和枚举类型
对于联合体,其语法结构和结构体对比可以说唯一的变换就是把struct换成union,其他的都一模一样,所以我们知道了struct的语法结构相当于知道union的语法结构,其初始化和创建也就得心应手。(上篇文章已经讲了struct的语法结构(声明),这里就不讲了,不知道的可以翻到上篇文章看一下)
E绵绵
2024/04/08
1400
联合体类型和枚举类型
【C语言】联合体(union)
联合体也叫做共用体,是指联合体的所有成员共用同一块内存空间。这也就说明了,联合体的大小至少是其成员所占空间的最大值。
埋头编程
2024/10/16
1470
【C语言】联合体(union)
结构体+联合体 详解
char c1为1个字节 1<8 即c1的对齐数是1 char c2为1个字节 1<8 即c2的对齐数是1 int i为4个字节 4<8 即i的对齐数是4 最大对齐数为4 因为最后也是取 8 是4的整数倍 即 8
lovevivi
2022/11/10
3140
结构体+联合体 详解
C语言从入门到实战——联合体和枚举
C语言中,联合体(union)是一种特殊的数据类型,允许存储不同类型的数据在同一块内存空间中。联合体的大小取决于其中最大的成员的大小,共享同一块内存空间的成员可以存储不同类型的数据。
鲜于言悠
2024/03/20
2530
C语言从入门到实战——联合体和枚举
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
联合体(union)是允许一个变量通过不同的接口访问内存的一种数据类型,表示一个变量可以存储不同类型的值,而枚举是使用enum关键字定义一组相关且互斥的整形常量集合。本章阿森将和你学习联合体类型的声明,特点,有关大小的计算,还有枚举类型的声明,优点和使用。文章干货满满!学习起来吧😃!
学习起来吧
2024/02/29
5330
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
C语言详解(联合和枚举)
自定义类型除了结构体,还有联合体(共用体)、枚举等,本篇文章将对联合体、枚举展开详细介绍,讨论其特点,以及相较于结构体而言联合体又有什么相同之处和相异之处
_小羊_
2024/10/16
1970
C语言详解(联合和枚举)
【C语言】自定义类型:联合和枚举
前面我们学习了一种自定义类型,结构体,现在我们学习另外两种自定义类型,联合 和 枚举。
云边有个稻草人
2024/10/21
900
【C语言】自定义类型:联合和枚举
【C语言】自定义类型:联合体和枚举
   像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以是不同的类型    联合体的特点是所有成员共⽤同⼀块内存空间,所以联合体也叫共同体,由于所有成员共用一块空间,所以编译器只为最⼤的成员分配足够的内存空间 ,并且当给联合体其中⼀个成员赋值时,其他成员的值也跟着变化,我们后面也会讲到    现在我们从联合体类型的声明开始学习,它的声明也和结构体的声明相似,结构体声明时使用struct关键字,而联合体声明时使用union关键字,如下:
TANGLONG
2024/10/15
930
【C语言】自定义类型:联合体和枚举
C语言自定义类型联合体与枚举超详解
像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。 给联合体其中一个成员赋值,其他成员的值也跟着变化。
fhvyxyci
2024/09/24
1160
C语言自定义类型联合体与枚举超详解
【C语言】联合和枚举
联合体的定义与结构体相似,但是联合体往往会节省更多的空间,它的特点是所有成员共用一块内存空间,结构体也叫共用体 联合体中给某一成员赋值,其他成员值往往会跟着变化
s-little-monster
2024/06/06
950
【C语言】联合和枚举
C语言自定义类型
风中的云彩
2024/11/07
1030
C语言自定义类型
【C语言基础】:自定义类型(二) -->联合和枚举
书山有路勤为径,学海无涯苦作舟。 创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~
爱喝兽奶的熊孩子
2024/04/10
1380
【C语言基础】:自定义类型(二) -->联合和枚举
自定义类型:联合体和枚举
但是编译器只为最大的成员分配足够的内存空间。联合体特点是所有成员共用同一块内存空间。所以联合体也叫共同体。
熬夜学编程的小王
2024/11/20
680
自定义类型:联合体和枚举
自定义类型:联合体和枚举
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。
Crossoads
2024/10/21
930
自定义类型:联合体和枚举
相关推荐
杂谈c语言——4.结构体和联合体
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验