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

 更新时间:2021年10月22日 15:26:52   作者:高邮吴少  
这篇文章主要为大家介绍了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特点及运用全面讲解教程的详细内容,更多关于C语言联合体Union教程的资料请关注脚本之家其它相关文章!

相关文章

  • C++使用栈实现括号匹配的代码详解

    C++使用栈实现括号匹配的代码详解

    在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过 C++ 代码,详细讲解如何使用栈来实现括号匹配,需要的朋友可以参考下
    2025-02-02
  • c语言中static的用法详细示例分析

    c语言中static的用法详细示例分析

    以下是对c语言中static函数的用法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • C语言动态内存管理深入探讨

    C语言动态内存管理深入探讨

    动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存,本文带你深入探究C语言中动态内存的管理
    2022-06-06
  • C# CLR学习 C++使用namespace实例详解

    C# CLR学习 C++使用namespace实例详解

    这篇文章主要为大家介绍了C# CLR学习 C++使用namespace实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Qt读写ini文件之QSettings用法

    Qt读写ini文件之QSettings用法

    这篇文章主要为大家介绍了Qt读写ini文件之QSettings的使用方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • VS2022中使用Copilot的图文教程

    VS2022中使用Copilot的图文教程

    大家都知道Copilot可以自动帮助写代码,那么这个工具是如果使用的呢?很多朋友不是很清楚,今天小编给大家分享一篇教程关于VS2022中使用Copilot的图文教程,感兴趣的朋友一起看看吧
    2022-04-04
  • cmake 学习笔记

    cmake 学习笔记

    这篇文章主要介绍了作者学习cmake 的相关资料与心得,有需要的小伙伴可以参考下
    2017-07-07
  • C++中 ‘=default ’及‘ =delete ’的使用

    C++中 ‘=default ’及‘ =delete ’的使用

    这篇文章主要介绍了C++中 =default 及 =delete 使用,使用=default和=delete可以控制编译器默认函数体的使用,下面我们就来看看具体的室友方法吧,需要的朋友也可以参考一下
    2021-12-12
  • C++中priority_queue与仿函数实现方法

    C++中priority_queue与仿函数实现方法

    这篇文章主要给大家介绍了关于C++中priority_queue与仿函数实现的相关资料,优先级队列是一种容器适配器,其底层通常采用vector容器,并通过堆算法来维护元素的顺序,文中通过代码介绍的非常详细《》需要的朋友可以参考下
    2024-10-10
  • 树形结构的3中搜索方式示例分享

    树形结构的3中搜索方式示例分享

    树的3中常见搜索方式,包括二叉树方式(每一层只有0和1)、满m叉树(每一层都有0 到m - 1)、子集树,也称为全排列树,需要的朋友可以参考下
    2014-02-02

最新评论