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

由浅到深认识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.kler.cn/a/273186.html

相关文章:

  • axios竟态问题
  • 适用于 c++ 的 wxWidgets框架源码编译SDK-windows篇
  • 杂货 | 每日资讯 | 2024.11.1
  • 「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
  • Rust 力扣 - 3090. 每个字符最多出现两次的最长子字符串
  • 【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介
  • 分享一个不错的three.js开源项目
  • 鸿蒙 Harmony 初体验
  • Linux——动静态库的制作及使用与动态库原理
  • hadoop分布式环境搭建
  • 【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频
  • 【华为OD机试】找座位【C卷|100分】
  • 代码随想录阅读笔记-哈希表【四数之和】
  • http协议的历史与基本概念
  • 第四百一十回
  • 【现代C++】移动语义和右值引用
  • JAVA八股文面经问题整理第6弹
  • 【C++】三大特性之多态
  • 苍穹外卖-day06:HttpClient、微信小程序开发、微信登录(业务流程)、导入商品浏览功能代码(业务逻辑)
  • VPTTA:为每张医疗图像生成特定的“提示”,解决跨不同设备和条件的医疗图像分割的准确性和适应性
  • 区间问题【前缀和】
  • PHP<=7.4.21 Development Server源码泄露漏洞 例题
  • 【JAVA】Servlet开发
  • HTML选择文件的实时预览
  • Netty中的核心概念
  • python中的闭包