c语言:联合体—union

news2024/11/26 19:27:48

联合体

  • 一.基本认识
    • 1.一个联合体的基本样式
    • 2.内部成员的访问
    • 3.具体的内存分配
  • 二.大小端对联合体的影响
  • 三.一个问题

在这里插入图片描述

一.基本认识

1.一个联合体的基本样式

在这里插入图片描述

在这里插入图片描述

看得出来其实跟我们定义结构体是一样的(如果还不大了解结构体的可以看看这篇博客什么是结构体),事实上结构体和联合体也经常混在一起使用

想要认识联合体就得从它的内部空间分配开始

我们来看一个例子

在这里插入图片描述

这里可能就发现有些不对了,一个int和一个char类型不应该是5个字节吗?为什么得出的结论却是4个字节呢?

这就引出了联合体的性质,联合体开辟空间的总大小是由最大的那个成员决定的。换言之,这里int是4个字节而char是1个字节,那么该空间大小就由int来决定,因为int更大(当然这里其实有点问题,并非它空间的大小就一定是最大成员的大小,我这里只说明一下现象)

在这里插入图片描述

相信大家都会认为这个空间大小是5,因为5最大吗,但其实并不是

在这里插入图片描述

这是怎么一回事呢?这里有点复杂直接说结论:联合体内的总大小必须能整除里面每个成员的大小,换言之int是4,char是1,而它所需最大空间又是5,那么联合体空间大小必须大于5并且能整除1和4

联合体的本质是内部所有成员共用一个空间

2.内部成员的访问

在这里插入图片描述

与结构体一样,联合体既可以通过点操作符来访问,也可以用箭头操作符通过指针来访问

3.具体的内存分配

在这里插入图片描述

这里需要了解的是每一个字节都会有地址,而我们平时使用&操作符访问的其实是一个字节的地址(最低地址)

在这里插入图片描述

而整个联合体的地址也是该地址,换句话说,联合体的地址和该联合体内最大成员的地址在数值上是一样的

在这里插入图片描述

上文已经说到该联合体是4个字节(也就是a的空间大小),那么开辟b的时候又是怎么一回事呢?

在这里插入图片描述

可以看到b的地址竟然也和a一样,其实这也不难理解,因为b和a本质上是共用一个空间的

在这里插入图片描述

每个成员使用空间都是从最大成员的最低地址开始向上呈放射性开辟(你需要多大空间就向上开辟多少字节)

得出结论:联合体内所有成员的起始地址都是一样的!!

那么可能又有疑问了,又是a开辟地址,又是b开辟地址,那么它们的地址不是重合了吗?

这就又要提到联合体的本质了,上文已经说过所有成员共用同一地址。换言之,每个成员在开辟地址时虽然都从同一地址向上开辟,但它们都认为自己是唯一的元素(可以简单理解成每一个成员都认为自己是联合体内第一元素),这是联合体的性质

二.大小端对联合体的影响

在这里插入图片描述在这里插入图片描述

首先在这里普及一下大小端的概念,将低权重数字放在低地址就是小端,将低权重数字放在高地址就是大端

在这里插入图片描述

这里通过我们的内存监视可以看到,VS将权重低的数字(44)放在了高地址处,所有VS是使用的小端存放

好,进行完前置工作后,我们来看下一段代码

在这里插入图片描述

可以看到我们通过这一段代码可以不用通过内存监视直接判断编译器是大端还是小端,它究竟是怎么做到的呢?接下来一一解析

首先要了解的是int是4个字节32个比特位,那么1在内存中应当是31个0+最后一个1

在这里插入图片描述在这里插入图片描述

b是char类型,只有1个字节,而根据上文联合体的空间起始地址都是一样的。那么可以知道b所开辟的空间永远是在最低地址。而又因为我们并未给b赋值,所以b一直是a用“剩下的”。换言之,如果是大端,那么b的值就是0;如果是小端,那么b的值就是1

如果理解了上面的演示,那么相信就能明白为什么联合体可以用来判断编译器是大端还是小端啦

三.一个问题

在这里插入图片描述

这个程序打印出来的是什么呢?

在这里插入图片描述

接下来进行解析

p=&u是让*p指向该联合体。p->a[0]=0x36,是指将a[0]赋值为16进制的36。p->i是说明我们打印的是i的值,打印i的值就是将这4个字节当成一个整体来访问,如下图我们用数组将每个字节分别赋值,但我们直接打印一个整体(也就是4个字节)

在这里插入图片描述

而我们的VS是小端,低权值数字放在低地址处,那么我们拿出来低地址的数据就该放到最后,也就是39放到最后。那么我们由下依次向上读取,最终就打印出来36373839啦

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计港口集团仓库管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

MoveIT1 Assistant 总结

文章目录环境步骤备注故障问题解决参考接上一篇,生成URDF后,在MoveIT Assistant生成配置用于运动规划。https://blog.csdn.net/woshigaowei5146/article/details/128237105?spm1001.2014.3001.5501 环境 Ubuntu20.04;ROS1 Noetic;VMware 步…

生成模型(一):GAN

生成对抗网络 (GAN)在许多生成任务中显示出很好的结果,以复制真实世界的丰富内容,例如图像、文字和语音。它受到博弈论的启发:一个生成器和一个判别器,在互相竞争的同时让彼此变得更强大。然而,训练 GAN 模型相当具有挑…

一篇解析Linux paging_init

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 介绍 从详细讲解Linux物理内存初始化中,可知在paging_init调用之前,存放Kernel Image和…

java计算机毕业设计ssm幼儿英语学习平台的设计与实现yofnu(附源码、数据库)

java计算机毕业设计ssm幼儿英语学习平台的设计与实现yofnu(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支…

注册微信小程序

文章目录1. 项目结构2. 页面组成3. json配置文件4. 认识页面5. WXML6. WXSS7. js文件8. 宿主环境9. 组件10. API11. 协同工作与发布跟公众号平台不共用一个账号,需要用其它邮箱另行注册,填写身份证信息(姓名、身份证号码)&#xf…

[附源码]Node.js计算机毕业设计电商后台管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

我妈眼中我的房间

ONE This is Me in My room as a teenager according to My Mother. 在我老妈眼里,这就是十几岁待在房间里的我。 ✨ 评论区 1️⃣ It’s all true. 这都是真的。 2️⃣ As a father - yep that’s you. 作为一个父亲,没错就是你。 3️⃣ Looking…

基于C语言开发(控制台)通讯录管理程序【100010030】

通讯录程序设计 一、课程设计题目与要求 题目 :通讯录管理程序 1. 问题描述 ​ 编写一个简单的通讯录管理程序。通讯录记录有姓名,地址(省、市(县)、街道),电话号码,邮政编码等四项。 2. 基本要求 程序应提供的基本基本管理…

Biotin-PEG-Pyrene,Pyrene-PEG-Biotin,芘丁酸-PEG-生物素peg化芘衍生物

聚乙二醇化芘衍生物之Pyrene-PEG-Biotin(Biotin-PEG-Pyrene),其化学试剂的中文名为芘丁酸-聚乙二醇-生物素,此试剂可用于碳纳米管和石墨烯表面功能化。它所属分类为Biotin PEG Pyrene PEG。 peg试剂的分子量均可定制,…

机器学习实战教程(二):决策树基础篇

一、决策树 决策树是什么?决策树(decision tree)是一种基本的分类与回归方法。举个通俗易懂的例子,如下图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形成代表终止模块(terminating block),表…

简单架构演变过程概图

单一应用就是一个jar包或者war包丢到tomcat等服务器上运行,耦合度很高,前后不分离,就是一整个应用 演变成 MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就…

1567_AURIX_TC275_电源管理_待机模式

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 进入待机模式前需要有序关闭各个模块以避免出现大的电流突变;之后,所有额度外设以及相关的中断全都关闭以避免异常唤醒;进入待机模式的过程中会有系统时…

JS中一个方法同时发送两个ajax请求出现报错问题的解决方法

目录 1、背景介绍 2、分析原因 3、解决办法 1、背景介绍 在实现前端显示后端数据时遇到这样一个问题:在js同一个方法中调用2个ajax,其中ajax1与ajax2之间没有联系,但是为了看效果需要同时请求数据显示,运行程序却报错,…

java计算机毕业设计ssm影城在线售票及票房数据分析系统8b9a0(附源码、数据库)

java计算机毕业设计ssm影城在线售票及票房数据分析系统8b9a0(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都…

Simulink基础【1】-弹簧-阻尼模型的常微分方程求解

Simulink基础【1】-弹簧-阻尼模型的常微分方程求解0. Simulink模块是什么?能干什么?1. 弹簧阻尼模型简介1.1 受常力的弹簧阻尼模型1.2 动力学方程2. simulink模型构建2.1 Simulink基础模块使用2.2 结果可视化后记0. Simulink模块是什么?能干什…

基于微信小程序旅游管理系统-计算机毕业设计

项目介绍 随着互联网的趋势的到来,各行各业都在考虑利用互联网将自己的信息推广出去,最好方式就是建立自己的平台信息,并对其进行管理,随着现在智能手机的普及,人们对于智能手机里面的应用旅游服务软件也在不断的使用…

区块链溯源的应用四大领域

目前基于区块链溯源的应用案例可以分为4大领域:食药畜牧、知识产权、数字凭证和供应链。 1、在食药畜牧领域中,区块链溯源将全流程的关键业务数据上链,做到信息公开透明;将链上链下相结合,确保信息真实性和品质可控&a…

[1.2.0新功能系列:二] Apache Doris 1.2.0 JDBC外表 及 Mutil Catalog

JDBC 外表 JDBC External Table Of Doris 提供了Doris通过数据库访问的标准接口(JDBC)来访问外部表,外部表省去了繁琐的数据导入工作,也省去了之前ODBC繁杂的驱动安装部署及版本匹配问题,兼容性更好,操作更简单,让Dor…

【猿如意】如意如意随我心意快快显灵—markdown笔记来啦

文章目录「猿如意介绍」「猿如意安装」【基于Windows环境安装】「markdown笔记简介」「markdown笔记功能介绍」「markdown笔记通过猿如意下载安装步骤及说明」「markdown笔记使用感受」🎨猿如意官网:猿如意-程序员的如意兵器,工具代码,一搜就有 &#x1…