由浅到深认识C语言(13):共用体

该文章Github地址:https://github.com/AntonyCheng/c-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识C语言(12):位段/位域

13.共用体

13.1.结构体和共用体的区别

  • 结构体:

    每个成员都有自己独立的空间;

    struct data{char a;short b;int c;
    };
    

    画图如下:

    ccccbba(null)
  • 共用体(联合体):

    所有成员共享同一份空间,空间大小由占内存最大的成员所决定;

    union data{char a;short b;int c;
    };  //a b c成员共享同一份空间
    

    画图如下:

    c(b)(a)c(b)cc

    共用体所表示是可以被不断刷新的,它就像是比较万能的一种数据类型,可以同时表示多种基本数据结构,甚至是数组等引用类型:

    //普通数据类型
    #include<stdio.h>typedef union data{char a;short b;int c;
    }DATA;int main(int argc, char* argv[]) {DATA data;printf("sizeof(data) = %d\n", sizeof(data));data.b = 1;data.a = 2;data.c = 4;printf("%x\n", data);
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    //引用数据类型
    #include<stdio.h>typedef union data{char a;short b;int c;int arr[5];
    }DATA;int main(int argc, char* argv[]) {DATA data;printf("sizeof(data) = %d\n", sizeof(data));data.b = 0;data.a = 0;data.arr[0] = 3;data.arr[1] = 2;data.arr[2] = 1;data.arr[3] = 1;data.arr[4] = 2;printf("%x\n", *data.arr);
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    这里打印出来的总大小为data.arr的大小,而取 * 是读取的该地址的首元素,此时就是数组的第一个元素;

    **案例:**思考下例打印结果;

    #include<stdio.h>typedef union data{char a;short b;int c;
    }DATA;int main(int argc, char* argv[]) {DATA data;data.b = 10;data.a = 20;data.c = 30;printf("%u\n", data.a+data.b+data.c);//由于
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    结果不可以看作是最后一次赋值决定了成员的取值,而是因为 30 这个数据太小了,一个字节都能装下,所以最小的一个数据类型 char 都能装下,所以可以被覆盖,具体解释出现在下一小节;

13.2.共用体成员提取

共用体的空间大小由最大的成员决定,共用体虽然共同拥有一份空间,但是从空间读取的字节数是由成员自身类型决定的,即这是一种内存覆盖的提取方法,示例如下:

#include<stdio.h>typedef union data{char a;short b;int c;
}DATA;int main(int argc, char* argv[]) {DATA data;data.c = 0x01020304;data.b = 0x0102;data.a = 0x01;printf("%#x\n", data.a+data.b+data.c);
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从十六进制换算来看,并不是简单的赋值操作,原理如下:

首先我们将三个数按照内存中的排布方式给列出来:

04030201
0201
01

按照赋值的顺序依次覆盖内存:

01010201

然后在这段内存上取值,画图如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识C语言(14):枚举

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

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

相关文章

ConKI: Contrastive Knowledge Injection for Multimodal Sentiment Analysis

文章目录 ConKI&#xff1a;用于多模态情感分析的对比知识注入文章信息研究目的研究内容研究方法1.总体结构2.Encoding with Knowledge Injection2.1 Pan-knowledge representations2.2 Knowledge-specific representations 3.Hierarchical Contrastive Learning4.损失函数5.训…

信息检索(十四):Simple Entity-Centric Questions Challenge Dense Retrievers

Simple Entity-Centric Questions Challenge Dense Retrievers 摘要1. 引言2. 背景和相关工作3. EntityQuestions4. 剖析问题&#xff1a;实体 vs 问题模式4.1 密集检索表现出流行偏差4.2 观察问题有助于泛化 5. 迈向稳健的密集检索6. 结论 原文链接&#xff1a;https://aclant…

一文教会你SpringBoot是如何启动的

SpringBoot启动流程分析 流程图 源码剖析 运行Application.run()方法 我们在创建好一个 SpringBoot 程序之后&#xff0c;肯定会包含一个类&#xff1a;xxxApplication&#xff0c;我们也是通过这个类来启动我们的程序的&#xff08;梦开始的地方&#xff09;&#xff0c;而…

从零开始学HCIA之SDN04

1、VXLAN数据封装 &#xff08;1&#xff09;Original L2 Frame&#xff0c;原始以太网报文&#xff0c;业务应用的以太网帧。 &#xff08;2&#xff09;VXLAN Header&#xff0c;VXLAN协议新定义的VXLAN头&#xff0c;长度为8字节。VXLAN ID&#xff08;VNI&#xff09;为2…

Unity 地图数据生成

在游戏开发中&#xff0c;地图是一个非常重要的元素&#xff0c;它可以影响游戏的玩法、视觉效果和整体体验。在Unity中&#xff0c;生成地图数据是一个常见的任务&#xff0c;它可以用于创建随机地图、关卡设计和其他一些应用场景。在本文中&#xff0c;我们将探讨如何使用Uni…

【趣味项目】命令行图片格式转换器

【趣味项目】一键生成LICENSE 项目地址&#xff1a;GitHub 项目介绍 一款命令行内可以批量修改图片格式的工具 使用方式 npm install xxhls/image-transformer -gimg-t --name.*.tiff --targetpng --path./images --recursiontrue技术选型 typeScript: 支持类型体操chal…

【网络安全】 MSF生成木马教程

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 环境准备&#xff1a; 名称系统位数IP攻击机Kali Linux6410.3.0.231客户端Windows 76410.3.0.234…

Python中的迭代器与生成器提高性能的秘密武器【第143篇—迭代器与生成器】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的迭代器与生成器&#xff1a;提高性能的秘密武器 在Python编程中&#xff0c;迭代…

网络安全等保测评指标一览表

什么是等保&#xff1f; 等保是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护&#xff0c;对信息系统中使用的信息安全产品实行按等级管理&#xff0c;对信息系统中发生的信息安全事件分等级响应、处…

关于SRE

SRE&#xff08;Site Reliability Engineering&#xff09;是一种由Google提出的运维工程师团队的方法论。SRE的目标是通过将软件工程的原则和实践应用于运维工作&#xff0c;来提高系统的可靠性和可扩展性。SRE强调自动化、监控、故障处理和容量规划等方面的工作&#xff0c;以…

[TJOI2010] 阅读理解 **STL**Tire树**

[TJOI2010] 阅读理解 题目链接&#xff1a; https://www.luogu.com.cn/problem/P3879 题目描述 思路1 &#xff08;STL大法&#xff09; 对每个单词&#xff0c;用map来映射存储它所在的短文编号 用set的好处&#xff1a; -------1. 存储直接自动排序&#xff0c;操作简单&…

python 通过 ast 替换代码

导航目录 目录结构要替换的代码替换代码的逻辑新建类&#xff0c;继承 ast运行新建的类最最重要的一步replace_code.py 完整代码 main.py 里面的代码执行结果 最后 目录结构 . ├── hello │ ├── __init__.py │ └── utils.py ├── main.py ├── replace_code…

【开源】SpringBoot框架开发毕业生追踪系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登陆注册模块2.2 学生基本配置模块2.3 就业状况模块2.4 学历深造模块2.5 信息汇总分析模块2.6 校友论坛模块 三、系统设计3.1 用例设计3.2 实体设计 四、系统展示五、核心代码5.1 查询我的就业状况5.2 初始化就业状况5.…

2024.3.18-408学习笔记-C-结构体

1、结构体 结构体是一种自定义类型。 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 2、结构体的声明 struct Student {char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号 };//分号不能丢以上声明的结构…

单链表OJ题

单链表OJ题&#xff08;文字解读 图解&#xff09; 1. 移除链表元素2. 反转链表3. 链表的中间结点4. 返回倒数第 k 个节点5. 合并两个有序链表 1. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff…

第六节:使用SMB开发WebService

一、概述 webservice在日常开发中是常用的接口形式&#xff0c;SMB在设计之初就将webservice作为重要的代理协议。在组件库中提供了webservice input和webservice output两个组件&#xff0c;分别用于发布接口和调用接口。 二、发布webservice 在csdnProject工程中创建名为c…

【设计模式】-工厂模式

工厂模式是一种创建型设计模式&#xff0c;它提供了一种在不指定具体类的情况下创建对象的方法。工厂模式的核心思想是将对象的创建与使用分离&#xff0c;降低系统的耦合度&#xff0c;使系统更加灵活、可扩展。 工厂模式主要分为三种类型&#xff1a;简单工厂模式、工厂方法…

#Ubuntu(修改root信息)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;命令行终端&#xff1a; a.右键&#xff0c;open terminal b.快捷键 ctrlaltt &#xff08;2&#xff09;进行root修改 sudo passwd &a…

【LeetCode周赛】第 389 场周赛

目录 3083. 字符串及其反转中是否存在同一子字符串 简单3084. 统计以给定字符开头和结尾的子字符串总数 中等3085. 成为 K 特殊字符串需要删除的最少字符数 中等3086. 拾起 K 个 1 需要的最少行动次数 困难 3083. 字符串及其反转中是否存在同一子字符串 简单 3083. 字符串及其…

程序员快速自我提升法——鱼皮大佬

0 软件开发人员自我成长 1 每天读2~3篇文章&#xff0c;可以行业趋势、技术类(和自己的工作有关的) 大厂技术博客科技资讯类&#xff1a;量子位、差评、新智元、无敌信息差 量子位、新智元经验分享、编程趋势、技术干活&#xff1a;程序员鱼皮、小林coding、java guide、程序…