C语言----联合体

news2024/11/18 11:39:13

        不知道大家是否听说过联合体这个名词。但其实大家不用觉得联合体有多特殊,大家可以想象结构体是一栋楼,里面有很多房间,住了形形色色的住户(不用或者相同的数据)。但联合体只有一个房间,所有的住户都挤在这个房间里面。但是这个房间的大小是以最大数据类型来决定的。比如说我们创建了一个联合体,里面放置了int类型和char类型。那么这个联合体大小计算int类型的大小了。

联合体声明

        上面我们也说过了,联合体与结构体一样都是多个成员构成的,这些成员可以不同的型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所
以联合体也叫:共⽤体。但是给联合体最大⼀个成员赋值,那么联合体会至少将最大的成员赋值处理,有多余空间在处理其他的成员,这也是与结构体的一个区别。那么大家看一下下面的照片,就知道

       大家看到了吧,联合体是用union+名字。联合体的内容与结构体是一样写的。然后联合体的初始化与结构体也是一样的。但是结构体是给内容分别赋值的。但联合体是定义一个全部都定义的了。 当然在创建联合体的时候可以同时定义。当然我们也可以像结构体一样省略联合体名:

       但是嘞,省略联合体名虽然看起来更加简洁了,但是因为没有了名字,后面就不能用该联合体定义新的变量。然后我们使用typedf将联合体改个名字如:

       使用看了上面的资料大家应该差不多了解了,联合体声明方法了吧。

验证联合体的特点

       大家知道,我在上面写了联合体是将所有的类型装在一个房子里面,并且会保证联合体最大的大小。那么我们看下面的两个代码。首先我们来确定所以类型是住在最大的那个房间里面的(就是类型最大的空间)

         这样大家可以看到打印的地址都是一样的。那么接下来验证这个房间是最大的那个类型:

      这里大家可以看到,我们明明是先个i赋的0x11223344。然后给c赋的0x55.然后我们打印i确实0x11223355。这就是联合体的另外一个特点。最少会保证最大联合体成员,然后有空间再处理其他的。那我们看一个示意图来辅助理解

联合体与结构体内存对比

        当然我们看了联合体内存分布那么我们直接与结构体内存分布对比,这样的话,可以加深我们对两种结构体的内存分布的印象。我们都将两种初始化且赋为0。

        计算联合体的大小

         我们在前面说过联合体与结构体有差异,但也有相同之处。如也可以使用#pragma pack(value) ,来修改对齐数。但当没有定义 #pragma pack(value) 这种指定 value 字节进行对齐时,它的计算规则是:联合体中最大成员所占内存的大小且必须为最大类型所占字节的最小倍数。举例如下:

      首先我们看第一个联合体。我们创建的联合体成员中char a[5]是最大的那么应该首先是5个字节,但是因为int类型是4个字节那么5不是4的倍数,并且5超过4了,那么只有8是复合计算规则的,使用计算的第一个联合体大小是8。

      第二个代码,我们可以看到short数组有7的元素,那么就是14个字节。但是int是4个字节呀。4>2,并且14最接近且大于14的41的倍数,只有16了。那么第二个联合体的大小就是16了。这样普通的联合体大小大家应该就可以计算了吧。

    接下来我我们看一下结构体嵌套联合体的大小是如何计算的。当然结构体嵌套联合体计算大小肯定也是有计算规则的,毕竟无规矩不成方圆嘛。那么嵌套的话规则是什么样的嘞:它的计算规则是,联合体按照最大成员所占字节且为最大数据类型所对应的字节的最小整数倍的原则进行计算,它所占的字节数与结构体中其他成员所占字节的总和应为结构体中最大数据类型所对应的字节的最小倍数。那我们如何理解嘞,我们来看一下下面的代码:

 

       先计算联合体中,最大char a[10]占10字节,但又要为8的最小倍数,因此联合体占16字节。
然后结构体中其余5+4+8=17 字节,不是结构体中最大数据类型 double 所对应的字节数 8的最小倍数,补齐到24字节。所以,综合起来整个结构体大小:16(联合体所占字节)+ 24字节=40字节。

      那当我们定义了对其数的话会稍微改变一点:

        联合体最大占10字节,且为2的最小倍数,因此联合体占10字节,然后10+5+4+8=27字节,但不是 2的最小倍数,因此如需满足上述规则,该结构体的大小应为:10(联合体所占字节) +5+1(空字节)+4+8=28 字节。

联合体使用举例

        大家看到上面后,可能会想,讲这么多,联合体的实际使用方法来个呗,我也好有个心理预期。将来联合体怎么用。那好我们就来个比较简单的联合体使用方法。大家还记得我们前段时间讲过的大小端问题嘛。并且看了上面的知识后我们知道,联合体的存储是优先最大的。那么如果我给最大的赋值1,然后打印最大,那么如果是0这就是大端,如果是1的话那么就是小端了。

      这样大家应该清楚利用联合体来计算我们需要的数据了吧。

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

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

相关文章

半小时到秒级,京东零售定时任务优化怎么做的?

导言: 京东零售技术团队通过真实线上案例总结了针对海量数据批处理任务的一些通用优化方法,除了供大家借鉴参考之外,也更希望通过这篇文章呼吁大家在平时开发程序时能够更加注意程序的性能和所消耗的资源,避免在流量突增时给系统…

认证模式~

认证方式 基于Cookie和Session的认证方式 基于Cookie和Session的认证是传统的Web应用认证机制。它依赖于HTTP协议无状态的特性,在客户端(浏览器)和服务器之间保持用户的状态。 工作原理 用户登录:用户通过输入用户名和密码来登…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业

文章目录 强烈推荐前言什么是OpenAI Sora?工作原理:算法原理:应用场景展望与其他视频生成模型相比有哪些优势和不足?优点缺点 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易…

Unity中字符串拼接0GC方案

本文主要分析C#字符串拼接产生GC的原因,以及介绍名为ZString的库,它可以将字符串生成的内存分配为零。 在C#中,字符串拼接通常有三种方式: 直接使用号连接;string.format;使用StringBuilder; 下面分别细…

table展示子级踩坑

##elemenui中table通过row中是否有children进行判断是否展示子集,通过设置tree-prop的属性进行设置,子级的children的名字可以根据自己的子级名字进行替换,当然同样可以对数据处理成含有chilren的子级list。 问题: 1.如果是根据后…

java大数据开发面试题,完美世界java面试题

02 JVM 线程JVM内存区域JVM运行时内存垃圾回收与算法JAVA四种引用类型GC分代收集算法 VS 分区收集算法GC垃圾收集器JAVA IO/NIOJVM类加载器 03 JAVA集合 接口继承关系和实现LISTSETMAP 04 JAVA多线程并发 JAVA并发知识库JAVA线程实现/创建方式4种线程池线程生命周期&#xf…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 :递归链表 简直是好题啊好题多做做 ---------------🎈🎈题目链接🎈🎈------------------- 解法1 :递归链表 简直是好题啊好题多做做 >>>…

Time Travel

题目链接 解题思路 由于所有边集中的边加起来的总和至多为,无向图即,可以存下所以直接对所有边集中的边进行建边,同时对于每条边,记录其所在边集号对于每个边集,由大到小维护其能通过的时间点然后从1号跑最短路到当前…

javaWeb个人学习03

事务管理: 概述: 一个事务里面的操作 要么同时成功, 要么同时失败例子: 比如在根据id 删除部门的时候 当部门删除成功了 但是遇到了异常 导致下面的代码没有继续执行下去 就没法根据id删除员工的信息了 这个时候 事务就很重要了 开启回滚 或者提交事务 要么同时成功 要么同时…

【考研数学】《汤家凤 1800 》《张宇 1000 》《李永乐 660 》《李林 880 》应该如何选择?

本人数学逆袭的路上,深知选对一本题集对我的重要性!!! 我本科期间,数学并不是我的强项,但是我却能够在考研的时候靠数学甩开别人几十分成功上岸,一本优秀的题集起到了关键的作用。 1800题&…

MySQL的事务与隔离级别

1. 什么是事务? 数据库中的事务是指对数据库执行一批操作,而这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。这个时候就需要用到事务。 最经典的例子就是转账,你要给朋友小白转 1000 块钱&…

选择排序,冒泡排序,插入排序,快速排序及其优化

目录 1 选择排序 1.1 原理 1.2 具体步骤 1.3 代码实现 1.4 优化 2 冒泡排序 2.1 原理 2.2 具体步骤 2.3 代码实现 2.4 优化 3 插入排序 3.1 原理 3.2 具体步骤 3.3 代码实现 3.4 优化 4. 快速排序 4.1 原理 4.2 具体步骤 4.3 代码实现 4.4 优化 为了讲…

如何优化一个看似正常的数据库

通常DBA是不会太了解业务逻辑的,遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化,但是并不是所有的sql都能通过添加索引来优化 这就需要重sql的本身来做分析,另外还要了解什么样的语句会不走索引!本文通过几个简单的例子…

RK3568 android11 调试陀螺仪模块 MPU-6500

一,MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器,属于惯性测量设备(IMU)的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器(DMP),能够提供6轴的运动…

计算机网络——IPV4数字报

1. IPv4数据报的结构 本结构遵循的是RFC 791规范,介绍了一个IPv4数据包头部的不同字段。 1.1 IPv4头部 a. 版本(Version):指明了IP协议的版本,IPv4表示为4。 b. 头部长度(IHL, Internet Header Length&…

web组态软件

1、强大的画面显示web组态功能 2、良好的开放性。 开放性是指组态软件能与多种通信协议互联,支持多种硬件设备,向上能与管理层通信,实现上位机和下位机的双向通信。 3、丰富的功能模块。 web组态提供丰富的控制功能库,满足用户的测…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

《互联网的世界》第二讲-最短路径优先

昨天讲 dns 时讲过,“你问一个当地人最近的厕所在哪,路人给你一个地址…”,可是只有地址还不够,如何到达那里呢?这是本节的内容。 自然的方式是,一边走一边问,根据路人的指示继续一边走一边问…

pikachu之xss获取键盘记录

前备知识 跨域 跨域(Cross-Origin)是指在互联网中,浏览器为了保护用户信息安全而实施的一种安全策略——同源策略(Same-Origin Policy),即浏览器禁止一个域上的文档或者脚本(如通过JavaScript发…

单片机复位按键电路、唤醒按键电路

目录 单片机复位按键 外部手动复位 单片机复位按键电路 复位按键电路1 复位按键电路2 单片机唤醒按键 单片机唤醒按键电路 单片机复位按键 单片机复位:简单来说,复位引脚就是有复位信号,就是从头开始执行程序 本质:就是靠…