文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言联合体Union特点及运用全面讲解教程

2024-04-02 19:55

关注

前言

上一期C语言快速入门我们学习了枚举类型及相关知识点

这期我们来跟着笔者学习一下联合体相关知识,相信聪明的你一定会有所收获!

提示:以下是本篇文章正文内容,下面案例可供参考

一、联合(共用体)定义

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

代码如下(示例):


#include<stdio.h>
union Un//联合类型的声明,union是联合体关键字
{
	char c;//1字节
	int i;//4字节
};
int main()
{
	union Un u = {0};
	printf("%d\n", sizeof(u));
	printf("%p\n", &u);
	printf("%p\n", &(u.c));//u.c表示联合体的成员c,该引用方法类似结构体
	printf("%p\n", &(u.i));
}

打印结果如下:

在这里插入图片描述

由sizeof(u)我们知道这个联合体总计占4个字节,而联合体成员i是int类型的,它占了4个字节,另外一个c是char类型占了1个字节,两个一起占了4个字节。说明c和i必然有一处是共用一块空间的,再者有u本身和它的两个成员是一个地址如上图003EFA80,说明首地址是重合的,简易示图如下:

在这里插入图片描述

由于共用空间这种特点就导致了,你改变c,i也会随之改变。这里和结构体是完全不一样的,结构体成员相互独立,但联合体不一样,改一个,其他的也会改变。所以这里,在同一时间,你只能使用一个联合体成员,你使用c就不要用i,因为你c改变的时候,一定会影响到你i的使用,程序非常容易出问题。

二、联合的特点及运用

联合的成员是共用一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合)

我们再来看看联合体在解决判断内存存储是大端存储还是小端存储的优势
代码如下(示例):


union U
{
	char c;
	int i;
}u;//联合体变量创建方法类比结构体
int main()
{
	u.i = 1;
	//0x 00 00 00 01
	//低地址-------->高地址
	//01 00 00 00 小端存储 低位放低地址
	//00 00 00 01 大端存储 低位放高地址
	if (u.c == 1)
	{
		printf("小端");
	}
	else
	{
		printf("大端");
	}
}

由于i和c是共用一块内存,我们创建了i之后只要判断1是在高地址还是低地址即可,又因为c是和i是一个地址(低),所以只要判断c里面放的是1还是0即可,非常的方便。

三、联合的大小计算

在计算联合体大小之前我们必须知道两个知识点:
1.联合的大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

举例说明:


#include<stdio.h>
union Un1
{
	char c[5];//1个char类型占1字节,5个占5字节
	int i;//4字节
};
union Un2
{
	short c[7];//1个short类型占2字节,7个占14字节
	int i;//4字节
};
int main()
{
	printf("%d\n", sizeof(union Un1));//打印8
	printf("%d\n", sizeof(union Un2));//打印16
}

Un1解释:

char创建一个大小为5的数组和放5个char类型的是一样道理,对齐数仍然是1
int类型的i自身大小4字节,默认对齐数8,对齐数是4。i和c两个最大的对齐数是4,而最大成员大小是数组c(5个字节),5不是4的倍数,我们需要对齐到最大对齐数的整数倍,也就是8(从5到8会浪费3个字节空间)

Un2解释:

short创建的c数组,我们同上可知其c对齐数是2,i对齐数是4,最大对齐数为4。最大成员大小也就是c数组大小为14,14并不是最大对齐数4的整数倍,14往上对齐到16,16是4的整数倍。

总结

本文介绍了联合体的定义、特点及使用、还有联合体大小的相关计算,相信认真学习的你一定会有所收获,期待你的关注,加快笔者更新速度嘿嘿。

以上就是C语言联合体Union特点及运用全面讲解教程的详细内容,更多关于C语言联合体Union教程的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯