C语言基础(五)——联合

联合

  • 引言
  • 联合的声明
    • 联合的声明
    • typedef命名联合
  • 设置联合的值
    • C89(标准)方式
    • 使用`.`操作符进行指定初始化
  • 联合的内存布局
  • 联合的使用场景
    • 节省内存资源
    • 实际应用案例分析
  • 总结

引言

在学习C语言基础时,联合和结构体是两个经常被拿来比较的概念。虽然它们在某些方面相似,比如:它们都能存储多个成员、在声明、初始化、访问等方面都有很多共同点。

所以如果想学习联合,结构体是不得不学习的一部分,请查看我的博客结构体。

联合相对于结构体而言使用了一种特殊的内存使用方法。联合允许在相同的内存位置存储不同的数据类型,当然,这种特性只有在特定场景下非常有用,尤其是在需要节省内存或者处理多种数据类型但不需要同时使用它们的场景中。

联合的声明

联合的声明

联合的声明与结构体类似,声明联合的语法代码如下:

union  Myunion{int intValue;float floatValue;char *string;
};

这里的union为声明联合的关键字,Myunion是联合的变量类型。

typedef命名联合

这一点也和结构体的命名非常类似。

typedef union{int intValue;float floatValue;char *string;
}Myunion;

这一串的代码与上面的代码的区别是使用了typedef将结构体起了一个新的名字,这样在之后的编码过程中就不需要使用union来定义联合。

设置联合的值

C89(标准)方式

如果联合想保存第一个字段的值,只要用花括号把值括起来,就可以把值
赋给联合中的第一个字段。

typedef union  {short count;float weight;float volume;
}quantity;quantity q={4}//相当于将count赋值为4

使用.操作符进行指定初始化

.操作符也是我们的老朋友了,只不过这次我们需要指定将某一个字段初始化。

typedef union  {short count;float weight;float volume;
}quantity;quantity q={.weight=1.5}//相当于将weight赋值为1.5
//或者用下面的代码:
quantity q;//先进行声明。
q.volume=3.7//对volume赋值为3.7。

联合的内存布局

在上述示例中,不管是intValuefloatValue还是string,它们都占据了相同的内存位置。这是联合的关键特点:同一时间只能有效地存储一个成员的值,因为所有成员共享内存。

typedef union  {short count;float weight;float volume;
}quantity;

这里的三个变量countweightvolume在同一时间只能有效地存储一个的值,如果强行进行定义,就会丢失数据。

为了能够表达所有的变量,short占2个字节、float占4个字节。以占最大内存的float为标准,联合占内存大小为4个字节。

在这里,针对内存布局,我们可以使用下面的代码进行说明:

union MyUnion data;
data.intValue = 3;//
printf("%d\n", data.intValue);
data.floatValue = 4.5;
printf("%d\n", data.floatValue);
printf("%d\n", data.intValue);// 如果执行这行代码,此时,尝试访问data.intValue将得到一个未定义的结果,因为最后存储的是floatValue。

联合的使用场景

节省内存资源

在系统中,内存资源是有限的,联合在一定程度上可以有效减少内存的占用。联合通过共享内存,不同类型的数据可以被折叠存储,减少了各个变量对内存的占用。

实际应用案例分析

在实际应用中,联合的使用非常广泛。例如,在网络通信中处理不同类型的消息包,或者在图形用户界面中处理不同类型的事件数据。

我们以一个现实的例子来说明这个问题,比如描述苹果,我们可以从个数、体积、质量等方面进行描述,我们只需要用一个量就可以描述苹果这个事物

union quantity {short count;float weight;float volume;
};

总结

在系统中,内存空间资源是有限的。由于联合的特殊内存使用方式,赋予了它极为高效的内存使用效率,这造就了它在一些特殊情形的极为优秀的应用。可是,“成也萧何,败也萧何”,在联合很大程度上节约内存的同时,联合在同一时间点只能表达一个变量,这导致了它的使用情形比较狭窄,如果没有合理利用,就会有数据丢失的风险。

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

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

相关文章

NuxtJs安装Sass后出现ERROR:Cannot find module ‘webpack/lib/RuleSet‘

最近了解NuxtJs时,发现问题比较多,对于初学者来说是件比较头痛的事。这次是安装sass预处理器,通过命令安装后,出现了ERROR:Cannot find module webpack/lib/RuleSet 错误,于是根据之前经验,对版…

Python统计分析——参数估计

参考资料:用python动手学统计学 所谓参数就是总体分布的参数。 1、导入库 # 导入用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入用于绘图的库 from matplotlib import pyplot as plt import seabor…

vue前端+nodejs后端通信-简单demo

本文记录vue前端nodejs后端通讯最简单的方法,供广大网友最快速进入全栈开发。 技术架构 前端 vue axios 后端 nodejs express 一、前端部分-搭建VUE 项目 vue create Vnodenpm run serve 启动; 具体操作步骤,请自行百度,这里没…

minitouch王者荣耀按键百分比

minitouch王者荣耀按键百分比 3 技能英雄 原图 2376 x 1104 xy说明x百分比y百分比23761104总分辨率160444金币0.0673400673400670.402173913043478296440物品10.1245791245791250.398550724637681296566物品20.1245791245791250.51268115942029470864摇杆0.1978114478114480…

51单片机之LED灯模块篇

御风以翔 破浪以飏 🎥个人主页 🔥个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…

当服务器发布代码与本地代码不一致无法发布时(java)

现象:服务器代码与本地代码不一致,本地代码发布上去有错误,替换配置文件,替换修改的文件也无效,原使用者已离职 我的思路: 1.下载服务器上发布包 2.反编译服务器上代码和本地代码,反编译工具…

机器学习本科课程 实验3 决策树处理分类任务

实验3.1 决策树处理分类任务 使用sklearn.tree.DecisionTreeClassifier完成肿瘤分类(breast-cancer)计算最大深度为10时,十折交叉验证的精度(accuracy),查准率(precision),查全率(recall),F1值绘制最大深度…

Haas 开发板连接阿里云上传温湿度和电池电压

目录 一、在阿里云上创建一个产品 二、开发环境的介绍 三、创建wifi示例 四、编写SI7006和ADC驱动 五、wifi配网 六、主要源码 七、查看实现结果 一、在阿里云上创建一个产品 登录自己的阿里云账号, 应该支付宝,淘宝账号都是可以的。 接着根据需求…

【Redis】理论基础 - 分区策略

[toc]、 在 Redis 的学习中,我们将重点介绍分区策略,这是一种通过水平扩展来提高 Redis 性能和处理大量数据的方法。通过分区,我们可以将数据分散存储在多个 Redis 实例中,充分利用集群的计算和存储资源。本篇博客将介绍 Redis 的…

设置 相关

记录使用过程中做的设置相关事宜。方便后续查询 vscode如何自动生成html格式: vscode快速生成html模板 --两种方法,亲测有用_vscode自动生成html模板-CSDN博客 使用第二个方式。存储html格式后缀。输入!,vscode自动补全。 安装…

ywtool login guard命令

一.登录防护功能介绍 登录防护功能主要检查系统日志/var/log/secure,查看系统有没有被暴力登录。登录防护默认是检测3分钟内登录系统失败15次(次数可修改)后,视其为有攻击性,拉黑此IP(centos7通过系统文件阻止IP,centos8/9通过防火墙阻止IP)。此脚本只针对SSH访问,…

platform tree架构下i2c应用实例(HS3003)

目录 概述 1 探究platform tree下的i2c 1.1 platform tree下的i2c驱动 1.2 查看i2c总线下的设备 1.3 使用命令读写设备寄存器 2 认识HS3003 2.1 HS3003特性 2.2 HS3003寄存器 2.2.1 温湿度数据寄存器 2.2.2 参数寄存器 2.2.3 一个参数配置Demo 2.3 温湿度值转换 2.…

在工业制造方面,如何更好地实现数字化转型?

实现工业制造的数字化转型涉及利用数字技术来增强流程、提高效率并推动创新。以下是工业制造领域更好实现数字化转型的几个关键步骤: 1.定义明确的目标: 清楚地概述您的数字化转型目标。确定需要改进的领域,例如运营效率、产品质量或供应链…

Camunda流程引擎数据库架构

💖专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧😘 💖数据库架构…

编程笔记 html5cssjs 081 JavaScript 异常处理语句

编程笔记 html5&css&js 081 JavaScript 异常处理语句 一、结构和语法:二、示例:总结 在JavaScript中,异常处理主要通过 try...catch...finally 语句实现。这个结构允许你捕获并处理程序运行时可能出现的错误(即异常&…

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制&…

C#通过文件头判断flv文件

目录 效果 代码 效果 代码 private void button1_Click(object sender, EventArgs e) { string path Application.StartupPath "\\test.flv"; //3byte 总是FLV(0x46 0x4C 0x56) byte[] Type new byte[3]; using (FileStre…

探索微服务治理:从发展到实践构建高效稳定的系统| 微服务的度量

随着软件行业的不断发展,微服务架构凭借其高度的灵活性、可扩展性和可维护性,逐渐成为企业应用的主流架构风格。然后微服务架构的复杂性也带来了一系列的挑战,其中之一就是如何有效地管理和治理微服务。本文灸哥给你详细介绍和服务治理相关的…

SQL 表信息 | 统计 | 脚本

介绍 统计多个 SQL Server 实例上多个数据库的表大小、最后修改时间和行数,可以使用以下的 SQL 查询来获取这些信息。 脚本 示例脚本: DECLARE Query NVARCHAR(MAX)-- 创建一个临时表用于存储结果 CREATE TABLE #TableSizes (DatabaseName NVARCHAR…

Java学习笔记2024/2/3

1. 方法 1.1 什么是方法 package com.angus.method.whatIsTheMethod_1;public class note {public static void main(String[] args) {//什么是方法//方法是程序当中最小的执行单元//调用方法和使用数组很类似//方法->方法名//数组->数组名->地址值//什么时候用到方…