前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言——联合体类型

C语言——联合体类型

作者头像
用户11029137
发布2024-03-19 15:49:55
2000
发布2024-03-19 15:49:55
举报
文章被收录于专栏:编程学习

一,什么是联合体

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

二,联合体的声明

1,联合体类型的声明

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

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

代码语言:javascript
复制
union Un
{
   char c;
   int i;
}; (注意:分号不能丢)

2,联合体变量的创建

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

代码语言:javascript
复制
#include<stdio.h>
union Un
{
	char c;
	int i;
};
union Un u1;

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

代码语言:javascript
复制
union Un
{
	char c;
	int i;
}u1;

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

三,联合体的特点

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

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

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

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

代码语言:javascript
复制
int main()
{
	printf("%d\n", sizeof(s1));
	printf("%d\n", sizeof(u1));
	return 0;
}

输出:

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

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

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

代码语言:javascript
复制
#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
复制
#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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,什么是联合体
  • 二,联合体的声明
    • 1,联合体类型的声明
      • 2,联合体变量的创建
      • 三,联合体的特点
        • 1,联合体与结构体的对比
          • 2,对联合体成员进行改变
          • 四,联合体的大小
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档