当前位置: 首页 > news >正文

由浅到深认识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):枚举

相关文章:

  • 1060:均值
  • 百度paddleocr GPU版部署
  • 如何实现自己的Spring Boot Starter
  • c语言游戏实战(8):飞机大作战
  • [嵌入式系统-39]:龙芯1B 开发学习套件 -9-PMON的文件结构
  • js【详解】深拷贝
  • Java学习笔记之Java基础语法02-运算符
  • c语言运算符优先级介绍
  • 20240316-1-向量化搜索
  • EMC Unity存储系统(包含VNXe)常用检查命令
  • 大模型: Function calling的作用
  • 整型溢出问题及解决之道
  • 【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0 App+微信小程序+云平台
  • 【MySQL】InnoDB引擎
  • HTML + CSS 核心知识点- 定位
  • php的引用
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 5、React组件事件详解
  • Docker入门(二) - Dockerfile
  • gulp 教程
  • JS 面试题总结
  • js作用域和this的理解
  • SpiderData 2019年2月23日 DApp数据排行榜
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue2.0项目引入element-ui
  • vue-router的history模式发布配置
  • Vue小说阅读器(仿追书神器)
  • 技术发展面试
  • 一道闭包题引发的思考
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #HarmonyOS:基础语法
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Git) gitignore基础使用
  • (poj1.2.1)1970(筛选法模拟)
  • (python)数据结构---字典
  • (ZT)一个美国文科博士的YardLife
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (离散数学)逻辑连接词
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (图)IntelliTrace Tools 跟踪云端程序
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET NPOI导出Excel详解
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 反编译_.net反编译的相关问题
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • //解决validator验证插件多个name相同只验证第一的问题
  • :O)修改linux硬件时间