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

大话C语言:第37篇 联合体

1 联合的定义与使用

联合体(union),又称为共同体,它是C语言中的一个特性,它允许在相同的内存位置存储不同的数据类型,但每次只能存储其中一种类型的数据。这意味着联合体的所有成员都共享同一段内存空间。

联合体的语法格式:

union 联合体名称 
{  类型1 变量名1;  类型2 变量名2;  ...  类型N 变量名N;  
};

注意,

  • 共用体union是一个能在同一个存储空间存储不同类型数据的类型

  • 共用体所占的内存长度等于其最长成员的长度,也有叫做共用体

  • 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用

  • 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖

  • 共用体变量的地址和它的各成员的地址都是同一地址

代码示例:

#include <stdio.h>// 共用体也叫联合体
union Test 
{unsigned char a;unsigned int b;unsigned short c;
};int main() 
{// 定义共用体变量union Test tmp;// 1、所有成员的首地址是一样的printf("%p, %p, %p\n", &(tmp.a), &(tmp.b), &(tmp.c));// 2、共用体大小为最大成员类型的大小printf("%llu\n", sizeof(union Test));// 3、一个成员赋值,会影响另外的成员tmp.b = 0x44332211;printf("%x\n", tmp.a); // 11printf("%x\n", tmp.c); // 2211tmp.a = 0x00;printf("short: %x\n", tmp.c); // 2200printf("int: %x\n", tmp.b);   // 44332200return 0;
}

其中,Test的内存大小为4字节,变量b是联合体中内存占用最大的变量,因此,以它的内存为准。

2 联合体和结构体的区别

联合体和结构体是编程中两种用于数据组织和管理的结构,它们有着显著的区别:

  • 内存使用:

    • 结构体(struct)的每个成员都拥有各自独立的内存空间,这些空间是互不干涉且同时存在的。结构体的总长度等于其所有成员长度之和,并且遵循内存对齐原则。

    • 联合体(union)的所有成员共享同一块内存空间。这意味着在任何时刻,联合体只能存储其成员中的一种类型的数据。尽管联合体可以包含多种类型的数据,但每次只有一个成员能使用这块内存。因此,联合体的总长度通常至少能容纳其成员中占用内存最大的数据类型的大小,且这个大小通常是所有成员类型大小的整数倍。

  • 数据存储与访问:

    • 在结构体中,所有成员的数据都是同时存在的,可以独立访问和修改每个成员的值,而不会影响到其他成员。

    • 联合体则不同,由于其成员共享内存,对联合体中某个成员的赋值将会覆盖其他成员的数据。换句话说,联合体的所有成员都是对同一块内存的引用,修改一个成员的值将影响其他成员的值。

  • 用途:

    • 结构体通常用于将不同类型的数据组合成一个整体,形成一个自定义的数据类型,便于数据的组织和管理。

    • 联合体则常用于需要节省内存空间的场景,或者需要动态地在多种类型之间切换的情况。例如,在处理底层硬件数据或进行网络通信时,可能会用到联合体。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 声明式UI语法
  • 使用nginxproxymanager管理nginx
  • 安卓基本布局(上)
  • CCleaner安卓专业版:全方位手机清理工具,极速提升设备性能
  • 环境搭建:如何在 Windows 上安装和配置 Apache Maven 3.9.8
  • python:基于YOLO框架和遥感图像的目标检测
  • 【安当产品应用案例100集】005-安当ASP实现Exchange双因素登录认证
  • uniapp App地图点击label
  • 在Stable Diffusion中驱动Tesla P40
  • <数据集>柑橘缺陷识别数据集<目标检测>
  • SQL注入实例(sqli-labs/less-8)
  • freeRTOS入门学习-基于STM32F103C8T6最小系统板-使用cubeMX创建一个新的工程
  • SpringBoot 框架学习笔记(七):Thymeleaf、拦截器 和 文件上传实现(解决了文件重名 和 按日期分目录存放问题)
  • Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图
  • 大数据项目——广告数仓之HTTP概述
  • 《剑指offer》分解让复杂问题更简单
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ➹使用webpack配置多页面应用(MPA)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • github从入门到放弃(1)
  • node.js
  • Node项目之评分系统(二)- 数据库设计
  • opencv python Meanshift 和 Camshift
  • PV统计优化设计
  • spring学习第二天
  • Swift 中的尾递归和蹦床
  • 从PHP迁移至Golang - 基础篇
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 记录:CentOS7.2配置LNMP环境记录
  • 前嗅ForeSpider教程:创建模板
  • -- 数据结构 顺序表 --Java
  • 听说你叫Java(二)–Servlet请求
  • 学习JavaScript数据结构与算法 — 树
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 数据结构
  • #APPINVENTOR学习记录
  • #Linux(make工具和makefile文件以及makefile语法)
  • #QT(QCharts绘制曲线)
  • (23)Linux的软硬连接
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (floyd+补集) poj 3275
  • (TOJ2804)Even? Odd?
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (论文阅读30/100)Convolutional Pose Machines
  • (数据结构)顺序表的定义
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .NET C# 操作Neo4j图数据库
  • .Net Core 中间件与过滤器
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET分布式缓存Memcached从入门到实战
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化