您现在的位置是:群英 > 开发技术 > 编程语言
C语言联合体Union的定义是什么,如何使用
Admin发表于 2022-08-20 17:44:51940 次浏览
相信很多人对“C语言联合体Union的定义是什么,如何使用”都不太了解,下面群英小编为你详细解释一下这个问题,希望对你有一定的帮助

前言

上一期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的定义是什么,如何使用”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-06-08 17:34:08 
摘要:下面由golang教程栏目给大家介绍Golang中函数作为值与类型,希望对需要的朋友有所帮助!在 Go 语言中,我们可以把函数作为一种变量,用 type 去定义它,那么这个函数类型就可以作为值传递,甚至可以实现方法,这一特性是在太灵活了..
2022-07-14 17:48:53 
摘要:3种强制将负数转换为正数的方法:1、使用取反运算“-”,语法“-$number”;2、利用“*”或“*=”运算符将原数乘以“-1”,语法“$number*(-1)”或“$number *= -1;”;3、使用abs()函数对原数取绝对值,语法“abs($number)”。
2022-09-05 17:27:12 
摘要:在vue中,指令是带有“v-”前缀的特殊特性(属性),指令特性的值预期是单个JavaScript表达式,语法为“v-指令:参数="表达式"”。Vue作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为;因此可以将指令看作特殊的HTML特性。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部