服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言联合体Union特点及运用全面讲解教程

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

2022-02-13 16:08高邮吴少 C/C++

这篇文章主要为大家介绍了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));
}

打印结果如下:

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

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

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

由于共用空间这种特点就导致了,你改变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教程的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/m0_57180439/article/details/120417270

延伸 · 阅读

精彩推荐
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24