联合体(共用体)的简单介绍

目录

概念:

联合的声明:

类比结构体:

联合体的大小:

联合的⼤⼩⾄少是最⼤成员的⼤⼩

 联合体的空间是共用的

联合体内部成员的赋值:

当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。 

利用联合体,判断当前机器是⼤端?还是⼩端?

什么是大端小端:

简单介绍一下:

代码演示:



概念:

联合也是一种特殊的自定义类型。

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

联合的声明:

union un
{int a;char c;
}u;
  • union是联合的关键字,不可更改。
  • un 是联合的标签,相当于联合的名字,可以更改。
  • {}花括号内部的是联合体的成员,和结构体一样,是一个不同类型数据的集合。
  • u表示的是该联合类型创造的变量。

类比结构体:

  • 联合体类比与结构体,或者说各方各面都和结构体类似,但是有一点不同。
  • 如果将结构体比作一栋楼,那么这栋楼内有很多层住户,每一个住户都有各自的独立的空间。
  • 而相比于结构体,联合体更像是一个出租屋,里面有好几位租客,它们很多的生活空间都是共用的。

 

联合体的大小:

联合的⼤⼩⾄少是最⼤成员的⼤⼩

union un
{int a;char c;
}u;int main()
{int ret = sizeof(u);printf("%d\n",ret);return 0;
}

从以上代码来看,int 类型的a占据了四个字节,而char 类型的c占据一个字节,那么理论上,联合体占据的总字节,应该是5个字节。

但是答案是这样吗?

 

并不是,这其实原理来自于联合体的特点之一:联合的⼤⼩⾄少是最⼤成员的⼤⼩。 

如上文说过,联合体好比一个出租屋,很多的生活空间都是共用的。

所以,联合体是开辟了一块大空间,让内部的成员一起使用。

 

 联合体的空间是共用的

又比如:

union un
{int a;char c;
}u;int main()
{printf("%p\n",&u);printf("%p\n",&(u.a));printf("%p\n",&(u.c));return 0;
}

最终的答案是:

 

 这样能够证明联合体的空间是共用的。

联合体内部成员的赋值:

  • 上文讲诉了联合体的空间内部就像合租一样,是共用空间的。
  •  所以当赋予一个联合体成员数值的时候,其他的联合体成员是会被该成员的数值覆盖。

例如:

union un
{int a;char c;
}u;int main
{union Un u;u.a = 0x11223344;u.c = 0x00;return 0;
}
  • 我们先后对成员a和成员c进行赋值。
  • 按照之前的说法,给成员c赋值,那么成员c所在的空间中的成员a的数值就会被c的数据覆盖,或者给成员a赋值,那么成员c所在空间的数据就会被a覆盖。

进行调试:

这是对int 类型的成员a进行赋值后。

随后又对char类型的成员c进行了赋值。

得到的结论如以上说法一致。,这种覆盖赋值的模式类似与共享单车。

 

当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。 

union un
{char arr[5];int i;
}u;int main()
{printf("%d\n",sizeof(union un));return 0;
}

以上代码是求联合体的字节数,按照之前的说法 “ 联合的⼤⼩⾄少是最⼤成员的⼤⼩。”

char arr[5]的字节大小是5,而int i 的字节大小是4,那么联合体大小一定是最大的成员的大小,也就是char arr[5]的大小,5个字节。

答案真是如此吗?

 

错误,这里涉及到了联合体成员内存对齐的原理。

 char arr[5]相当于写了五个char,所以最大其实是int, 但是空间不够啊,所以应该用对齐解决,而int的默认对齐数是8 所以最大字节数是8。

又列如:

union un
{short arr[7];int i;
}u;int main()
{printf("%d\n",sizeof(union un));return 0;
}

short arr[7]占据的是14个字节,int i占据的是4个字节,而这里求除的联合体大小是16个字节,是最大类型 int 的字节数的4倍。

 

利用联合体,判断当前机器是⼤端?还是⼩端?

什么是大端小端:

大端小端是内存存储数据的方法,而内存存储数据一般是二进制数位进行存储,所以这里便有了区分。

简单介绍一下:

int i = 1 
  • 1的十六进制数位:0x 00 00 00 01  
  • 去除前缀0x,十六进制数位从低到高是 01 00 00 00 这就是小端
  • 而十六进制数位从高到低 00 00 00 01 这就是大端。

而判断机器的是大端还是小端,则是判断这十六进制数位的最前端的字节到底是00还是01,如果是00那么是大端,如果是01那么是小端。(这里使用整型数字1的十六进制数位进行判断)

而在此时便可以利用联合体的特点。

代码演示:

int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;
}

通过提取出 int 类型的成员i 并进行赋值,而后返回char类型的成员c进行读取,因为联合体的特点,这两个成员都处在一个空间,成员c是char类型,并没有进行赋值,所以再返回后,读取的其实是int类型的成员i的数据,也是int类型成员i的最前端的空间数据。

也就是可以使用以上代码,读取整型数字1再该编译器中,使用的是大端还是小端。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/116760.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索树堆Treap和红黑树的优势和劣势

探索树堆Treap和红黑树的优势和劣势 一、背景知识二、树堆(Treap)的介绍三、红黑树(RB-Tree)的介绍四、树堆(Treap)与红黑树(RB-Tree)的比较总结 博主简介 💡一个热爱分享…

Java空指针异常

在所有的RuntimeException异常中,Java程序员最熟悉的恐怕就是NullPointerException了。 NullPointerException即空指针异常,俗称NPE。如果一个对象为null,调用其方法或访问其字段就会产生NullPointerException,这个异常通常是由J…

单片机开发中的内存优化

在单片机开发中,内存优化是至关重要的,它不仅能够降低成本,还可以提高性能。本文将深入讨论如何在STM32单片机和C语言的环境中实施内存优化策略,以确保项目的顺利进行。 单片机内存资源通常包括RAM(随机访问存储器&am…

wireshark抓包分析

题目一:Cephalopod(图片提取) 打开下载好的数据包:CtrlF 按照如图选择分组字节流,选择字符串,输入‘flag’筛选出数据包; 点击筛选出来的一条数据包,右键选择追踪tcp流; 然后可以看到png的字样…

渗透测试漏洞原理之---【CSRF跨站请求伪造】

文章目录 1、CSRF概述1.1、基本原理1.1.1、基本概念1.1.2、关键点1.1.3、目标 1.2、CSRF场景1.2.1、银行支付转账1.2.2构造虚假网站1.2.3、场景建模 1.3、CSRF类别1.3.1、POST方式 1.4、CSRF验证1.4.1、CSRF PoC Generator 2、CSRF攻防2.1、CSRF实战2.1.1、与XSS 漏洞相结合 2.…

获取Linux内核源码

在嵌入式平台上做Linux开发的时候,我们用的kernel都是芯片厂家移植到自家平台上的,但是最初的原生Linux内核的源码是从哪里来的呢?下面我们介绍一下怎么获取原生的Linux源码。 从Linux社区获取内核kernel源码 Linux社区的官方网站是 https:…

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…

Echart笔记

Echart笔记 柱状图带背景色的柱状图将X与Y轴交换制作为进度条 柱状图 带背景色的柱状图 将X与Y轴交换制作为进度条 //将X与Y轴交换制作为进度条 option { xAxis: {type: value,min:0,max:100,show:false,//隐藏x轴},yAxis: {type: category,data:[进度条],show:false,//隐…

【论文阅读】Pay Attention to MLPs

作者:Google Research, Brain Team 泛读:只关注其中cv的论述 提出了一个简单的网络架构,gMLP,基于门控的MLPs,并表明它可以像Transformers一样在关键语言和视觉应用中发挥作用 提出了一个基于MLP的没有self-attentio…

本地开机启动jar

1:首先有个可运行的jar包 本地以ruiyi代码为例打包 2:编写bat命令---命名为.bat即可 echo off java -jar D:\everyDay\test\RuoYi\target\RuoYi.jar 3:设置为开机自启动启动 快捷键winr----输入shell:startup---打开启动文档夹 把bat文件复…

【算法与数据结构】404、LeetCode左叶子之和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:思路比较简单,遍历所有节点然后判断该节点是否为左叶子节点,如果是&#xff0c…

Flink的checkpoint是怎么实现的?

分析&回答 Checkpoint介绍 Checkpoint容错机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保证应用流图状态的一致性。Flink的Checkpoint机制原理来自“Chandy-Lamport alg…

【Selenium2+python】自动化unittest生成测试报告

前言 批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、导入…

在windows下安装配置skywalking

1.下载地址 Downloads | Apache SkyWalkinghttp://skywalking.apache.org/downloads/ 2.文件目录说明 将文件解压后,可看到agent和bin目录: Agent:作为探针,安装在服务器端,进行数据采集和上报。 Config&#xff1a…

【SpringSecurity】十、JWT工具类

文章目录 1、jwt类库与相关依赖2、工具类3、总结 1、jwt类库与相关依赖 <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.11.0</version> </dependency>…

(三)行为模式:7、观察者模式(Observer Pattern)(C++示例)

目录 1、观察者模式&#xff08;Observer Pattern&#xff09;含义 2、观察者模式的UML图学习 3、观察者模式的应用场景 4、观察者模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现观察者模式的实例 1、观察者模式&…

Matlab(GUI程式设计)

目录 1.MatlabGUI 1.1 坐标区普通按钮 1.1.1 对齐组件 1.1.2 按钮属性 1.1.3 脚本说明 1.1.4 选择呈现 1.3 编译GUI程序 在以前的时候&#xff0c;我们的电脑还是这样的 随着科技的不断进步&#xff0c;我们的电脑也发生着翻天覆地的改变1990s&#xff1a; 在未来&#xff0c…

Mac 多版本jdk安装与切换

macOS上可以安装多个版本的jdk&#xff0c;方法如下&#xff1a; 1.下载jdk 在Oracle官网上下载不同版本的jdk&#xff1a; https://www.oracle.com/java/technologies/downloads/#java17 方案一 1.查看本机所有的jdk /usr/libexec/java_home -V3. 配置环境变量 打开bash_…

从零开发JavaWeb入门项目--十天掌握

原文网址&#xff1a;从零开发JavaWeb入门项目--十天掌握_IT利刃出鞘的博客-CSDN博客 简介 这是一个靠谱的JavaWeb入门项目实战&#xff0c;名字叫蚂蚁爱购。从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目&#xff0c;教程路线是&#xff1a;搭…

CSS使两个不同的div居中对齐的三种解决方案

在CSS中&#xff0c;有多种方法可以让两个不同的div居中对齐&#xff0c;包括相对定位和绝对定位。以下是两种常见的方法&#xff1a; 方法一&#xff1a;使用Flexbox Flexbox是一个用于创建灵活布局的CSS3模块。使用Flexbox&#xff0c;可以很容易地对元素进行居中对齐。 H…