c语言中联合Union的作用及示例代码说明

引言

在C语言中,联合(Union)是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。其它语言中没有类似的语法。
以下是联合的一些作用以及相应的例子。

作用

1 节省空间

联合可以用来节省内存,因为它允许多个成员共享同一块内存空间。例如,一个联合可以存储不同类型的数据,但任何时候只能使用其中一个。

union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10; // 使用整数printf("%d\n", data.i);data.f = 220.5; // 使用浮点数printf("%f\n", data.f);strcpy(data.str, "C Programming"); // 使用字符串printf("%s\n", data.str);return 0;
}

数据共享

联合可以用来在不同的上下文中共享同一块内存区域。例如,一个联合可以用来存储一个整数或者一个浮点数,这取决于程序的需要。也是一种节省的情况。

union Number {int integer;float floating;
};int main() {union Number num;num.integer = 10;printf("Integer: %d\n", num.integer);num.floating = 220.5;printf("Float: %f\n", num.floating);return 0;
}

数据打包

在网络编程中,联合可以用来打包和解包数据。例如,一个联合可以用来存储一个IP地址的不同表示形式。

union IPAddr {struct { unsigned char byte1, byte2, byte3, byte4; } bytes;unsigned long addr;
};int main() {union IPAddr ipAddr;ipAddr.bytes.byte1 = 192;ipAddr.bytes.byte2 = 168;ipAddr.bytes.byte3 = 1;ipAddr.bytes.byte4 = 1;printf("IP Address: %lu\n", ipAddr.addr);return 0;
}

或如下函数:

//将BYTE字节组装成DWORD长字数据
DWORD MakeDword(BYTE by1, BYTE by2, BYTE by3, BYTE by4)
{Union{DWORD dwData;BYTE byData[4];}temp;temp.byData[0] = by1;temp.byData[1] = by2;temp.byData[2] = by3;temp.byData[3] = by4;return temp.dwData;
}

位域操作

联合可以与位域结合使用,以访问和操作单个位或位组。例如,一个联合可以用来存储一个结构体,该结构体包含位域。

union PackedData {struct {unsigned int a:1;unsigned int b:3;unsigned int c:4;} bits;unsigned int all;
};int main() {union PackedData data;data.bits.a = 1;data.bits.b = 7;data.bits.c = 15;printf("Packed Data: %u\n", data.all);return 0;
}

类型转换

联合可以用来实现不同数据类型之间的隐式类型转换。例如,一个联合可以用来存储一个字符数组或者一个整数。

union TypeCast {char str[4];int num;
};int main() {union TypeCast data;data.str[0] = 'C';data.str[1] = ' ';data.str[2] = 'P';data.str[3] = 'R';printf("String: %s\n", data.str);printf("Integer: %d\n", data.num);return 0;
}

内存对齐

联合可以用来绕过编译器的内存对齐规则。例如,一个联合可以用来存储一个结构体,该结构体的成员有不同的对齐要求。

union MemoryAlign {char c;double d;
};int main() {union MemoryAlign data;data.c = 'A';printf("Char: %c\n", data.c);data.d = 3.14;printf("Double: %f\n", data.d);return 0;
}

结构体成员

联合可以作为结构体的成员,这样可以在一个结构体中存储不同类型的数据。

struct Student {char name[50];union {int marks;float percentage;} scores;
};int main() {struct Student std;strcpy(std.name, "John Doe");std.scores.marks = 95;printf("Name: %s, Marks: %d\n", std.name, std.scores.marks);return 0;
}

变体类型

联合可以用来模拟变体类型,即可以存储多种类型中的一种。

union Variant {int i;float f;char *s;
};int main() {union Variant var;var.i = 10;printf("Integer: %d\n", var.i);var.f = 3.14f;printf("Float: %f\n", var.f);var.s = "Hello";printf("String: %s\n", var.s);return 0;
}

指针运算

联合的指针可以进行算术运算,因为联合的大小是其最大成员的大小。

union PointerArithmetic {int i;float f;
};int main() {union PointerArithmetic data;data.i = 10;printf("Integer: %d\n", data.i);// 指针运算printf("Next float: %f\n", *(float*)&data + 1.0f);return 0;
}

结论

使用联合union语法,能在程序中做出巧妙的设计,这也是c语言作为系统级语言独特的魅力之所在。
当然,在使用联合时,也需要确保正确地管理内存和数据类型,以避免潜在的错误和未定义行为。

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

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

相关文章

【Unity】Game Framework框架学习使用

前言 之前用过一段时间的Game Framework框架,后来有那么一段时间都做定制小软件,框架就没再怎么使用了。 现在要做大型项目了,感觉还是用框架好一些。于是又把Game Framework拾起来了。 这篇文章主要是讲Game Framework这个框架是怎么用的…

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境,所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后,可以通过 sudo update-alter…

【Web前端】从回调到现代Promise与Async/Await

异步编程是一种让程序能够在等待某些操作完成的同时继续执行其他任务的关键技术,打破了传统编程中顺序执行代码的束缚。这种编程范式允许开发者构建出能够即时响应用户操作、高效处理网络请求和资源加载的应用程序。通过异步编程,JavaScript 能够在执行耗…

文心一言 VS 讯飞星火 VS chatgpt (388)-- 算法导论24.5 8题

八、设 G ( V , E ) G(V,E) G(V,E) 为一个带权重的有向图,且包含一个可以从源结点 s s s 到达的权重为负值的环路。请说明如何构造一个 G G G 的边的松弛操作的无限序列,使得每一步松弛操作都能对某一个最短路径估计值进行更新。如果要写代码&#x…

uni-app资源管理与图标使用全解

uni-app 框架与资源路径 不需要专门去学习小程序的语法,uni-app使用的是vue的语法,不是小程序自定义的语法。 搜索框:有疑问直接搜索框输入,BUG直接复制错误提示粘贴上去搜索。 介绍:先看这个页面,就知道u…

大数据新视界 -- 大数据大厂之 Impala 性能优化:数据加载策略如何决定分析速度(上)(15/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Java:JVM

1.JVM内存区域的划分 一个Java写的程序跑起来,就得到了一个Java进程 JVM 上面运行的字节码指令; 进程:操作系统资源分配的基本单位; 内存区域的划分: 1.程序计数器 在内存空间里(比较小的空间),保存了下一个要执行的指令的内存地址(元数据区的地址); 这里的"下一条…

阿里公告:停止 EasyExcel 更新与维护

最近,阿里发布公告通知,将停止对知名 Java Excel 工具库 EasyExcel 的更新和维护。EasyExcel 由阿里巴巴开源,作者是玉箫,在 GitHub 上拥有 30k stars、7.5k forks 的高人气。 据悉,EasyExcel 作者玉箫去年已从阿里离…

安卓智能对讲终端|北斗有源终端|三防对讲机|单兵终端|单北斗

在当今快速发展的通信技术时代,智能对讲手持机已成为众多行业领域中不可或缺的通讯工具。QM240T安卓智能对讲手持机,作为一款集先进技术与实用功能于一身的高端设备,凭借其卓越的性能和多样化的应用特性,正逐步引领对讲机市场的革…

5G智能对讲终端|北斗有源终端|北斗手持机|单兵|单北斗

在当今这个快速发展的数字化时代,5G技术的广泛应用正以前所未有的速度推动着各行各业的变革。作为这一技术浪潮中的重要一环,5G智能终端QM630D凭借其卓越的性能和多样化的功能,在林业、渔业、安保、电力、交通等多个领域展现出了巨大的应用潜…

【计网】数据链路层笔记

【计网】数据链路层 数据链路层概述 数据链路层在网络体系结构中所处的地位 链路、数据链路和帧 链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。 数据链路(Data Link)是基于链路的。当在一条链路上传送数据时&a…

重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 整合 Elasticsearch 8.x (二)使用Repository 1. 环境准备1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤2.1 创建实体类2.2 创…

计算机课程管理:Spring Boot与工程认证的协同创新

3系统分析 3.1可行性分析 通过对本基于工程教育认证的计算机课程管理平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于工程教育认证的计算机课程管理平…

<项目代码>YOLOv8 苹果腐烂识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI(图形设备接口)中的一个函数,用于在设备上下文(device context, DC)之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…

SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记

这是一篇港科大学生在google research 实习期间发在ECCV2024的语义引导生成式修复的文章,港科大陈启峰也挂了名字。从首页图看效果确实很惊艳,尤其是第三行能用文本调控修复结果牌上的字。不过看起来更倾向于生成,对原图内容并不是很复原&…

如何平滑切换Containerd数据目录

如何平滑切换Containerd数据目录 大家好,我是秋意零。 这是工作中遇到的一个问题。搭建的服务平台,在使用的过程中频繁出现镜像本地拉取不到问题(在项目群聊中老是被人出来😅)原因是由于/目录空间不足导致&#xff0…

Sharding运行模式、元数据、持久化详解

运行模式 单机模式 能够将数据源和规则等元数据信息持久化,但无法将元数据同步至多个Sharding实例,无法在集群环境中相互感知。 通过某一实例更新元数据之后,会导致其他实例由于获取不到最新的元数据而产生不一致的错误。 适用于工程师在本…

基于springboot+小程序的鲜花管理系统(鲜花1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本网上花店微信小程序分为管理员还有用户两个权限,管理员可以管理用户的基本信息内容,可以管理公告信息以及鲜花信息,能够与用户进行相互交流等操作&am…

金融学期末速成笔记

【拯救者】金融学速成(基础习题) 重点: 市场经济是发达的商品经济。在市场经济条件下,市场机制作为资源配置方式,发挥基础性作用。 除具有商品经济的一般特征外,与商品经济相比,市场经济还具有一些新的特征…