【C语言】union 关键字

在这里插入图片描述

在C语言中,union关键字用于定义联合体。联合体是一种特殊的数据结构,它允许不同的数据类型共享同一段内存。所有联合体成员共享同一个内存位置,因此联合体的大小取决于其最大成员的大小。

定义和使用联合体

基本定义

定义一个联合体类型时,需要使用union关键字,后跟联合体的名称和成员的定义。

#include <stdio.h>// 定义一个联合体类型
union Data {int i;float f;char str[20];
};int main() {// 声明一个联合体变量union Data data;// 赋值给联合体成员data.i = 10;printf("data.i: %d\n", data.i);data.f = 220.5;printf("data.f: %.2f\n", data.f);strcpy(data.str, "C Programming");printf("data.str: %s\n", data.str);// 注意:联合体成员共享内存,赋值一个成员会影响其他成员的值printf("data.i: %d\n", data.i);printf("data.f: %.2f\n", data.f);return 0;
}

在这个例子中,定义了一个名为Data的联合体类型,它包含三个成员:ifstr。在main函数中,声明了一个Data类型的变量data,并对其成员进行了赋值和访问。

共享内存

联合体的一个重要特性是所有成员共享同一块内存,因此一个成员的值会覆盖其他成员的值。

#include <stdio.h>
#include <string.h>// 定义一个联合体类型
union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10;printf("data.i: %d\n", data.i);data.f = 220.5;printf("data.f: %.2f\n", data.f);strcpy(data.str, "C Programming");printf("data.str: %s\n", data.str);// 因为最后一次赋值的是str,所以i和f的值会被覆盖printf("data.i: %d\n", data.i);  // 未定义的行为printf("data.f: %.2f\n", data.f);  // 未定义的行为return 0;
}

在这个例子中,由于联合体成员共享内存,最后一次赋值data.str会覆盖之前的data.idata.f的值,因此访问这些成员的值会导致未定义行为。

使用typedef简化联合体

使用typedef可以简化联合体的使用,使得在声明变量时不需要每次都使用union关键字。

#include <stdio.h>
#include <string.h>// 使用typedef定义联合体类型
typedef union {int i;float f;char str[20];
} Data;int main() {// 声明一个联合体变量Data data;data.i = 10;printf("data.i: %d\n", data.i);data.f = 220.5;printf("data.f: %.2f\n", data.f);strcpy(data.str, "C Programming");printf("data.str: %s\n", data.str);return 0;
}

在这个例子中,使用typedefunion Data定义了一个别名Data,这样在声明变量时就不需要使用union关键字了。

联合体的大小

联合体的大小等于其最大成员的大小,因为所有成员共享同一块内存。

#include <stdio.h>union Data {int i;float f;char str[20];
};int main() {printf("Size of union: %zu bytes\n", sizeof(union Data));return 0;
}

在这个例子中,sizeof运算符用于计算联合体的大小。

示例程序

以下是一个包含多种用法的综合示例:

#include <stdio.h>
#include <string.h>typedef union {int i;float f;char str[20];
} Data;int main() {Data data;data.i = 10;printf("data.i: %d\n", data.i);data.f = 220.5;printf("data.f: %.2f\n", data.f);strcpy(data.str, "C Programming");printf("data.str: %s\n", data.str);// 由于最后一次赋值的是str,所以i和f的值会被覆盖printf("data.i: %d\n", data.i);  // 未定义的行为printf("data.f: %.2f\n", data.f);  // 未定义的行为return 0;
}

在这个示例中,data联合体的成员被依次赋值并打印,最后一次赋值data.str覆盖了之前的成员值,导致对data.idata.f的访问结果未定义。

联合体的应用场景

  1. 节省内存:在某些情况下,可以使用联合体节省内存。例如,当一个变量在不同的时间需要存储不同类型的数据时,可以使用联合体来节省内存空间。

  2. 类型转换:联合体可以用于实现不同类型之间的转换。

#include <stdio.h>typedef union {float f;unsigned int i;
} FloatIntUnion;int main() {FloatIntUnion u;u.f = 3.14f;printf("Float value: %f\n", u.f);printf("As unsigned int: %u\n", u.i);return 0;
}

在这个例子中,联合体用于查看同一段内存在不同类型下的表示。

总结

union关键字在C语言中用于定义联合体,允许不同的数据类型共享同一段内存。联合体的大小由其最大成员的大小决定。联合体在节省内存和类型转换等场景中非常有用。尽管联合体的使用可能导致一些成员值的未定义行为,但在特定的应用场景下,联合体依然是一个强大的工具。

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

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

相关文章

Owl 中的 Props 概述

在动态的 Web 开发环境中&#xff0c;创建模块化和可重用组件对于构建可扩展应用程序至关重要。将这种方法提升到新水平的一个框架是 Owl&#xff0c;其中“props”&#xff08;属性的缩写&#xff09;的概念在协调父组件和子组件之间的通信中起着关键作用。在 Owl 框架中&…

SiCat:一款多功能漏洞利用管理与搜索工具

关于SiCat SiCat是一款多功能漏洞利用管理与搜索工具&#xff0c;该工具基于纯Python 3开发&#xff0c;旨在帮助广大研究人员有效地识别和收集来自开源和本地存储库的漏洞信息。 SiCat专注于网络安全管理方面的实践工作&#xff0c;允许研究人员快速实现在线搜索&#xff0c;…

2024亚太赛(中文赛)数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B<C<A&#xff0c;开放度&#xff1a;C<A<B。 综合评价来看 A题适合有较强计算几何和优化能力的团队&#xff0c;难度较高&#xff0c;但适用面较窄。 B题数据处理和分析为主&#xff0c;适合数据科学背景的团队…

Android TextView的属性与用法

文本控件包括TextView、EditText、AutoCompleteTextView、CheckedTextView、MultiAutoCompleteTextView、TextInputLayout等&#xff0c;其中TextView、EditText是最基本最重要的文本控件&#xff0c;是必须要掌握的文本控件。 1.TextView TextView控件用于显示文本信息&…

C#常用关键字举例

关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符&#xff0c;但是&#xff0c;如果您想使用这些关键字作为标识符&#xff0c;可以在关键字前面加上 字符作为前缀。 class: public class MyClass {// Class definition }interface: public interface IMyInterfac…

【C++设计模式】(一)面向对象编程的八大原则

文章目录 面向对象编程的八大原则1 单一职责原则2 开放-关闭原则3 里氏替换原则4 接口隔离原则5 依赖倒置原则6 迪米特法则/ 最少知识原则7 合成复用原则8 针对接口编程而不是针对实现编程 面向对象编程的八大原则 面向对象编程有一系列的设计准则来保证软件的质量&#xff0c…

自然语言处理学习--3

对自然语言处理领域相关文献进行梳理和总结&#xff0c;对学习的文献进行梳理和学习记录。希望和感兴趣的小伙伴们一起学习。欢迎大家在评论区进行学习交流&#xff01; 论文&#xff1a;《ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information》 下面…

原厂商是什么意思?云管平台原厂商有哪些企业?

最近不少IT小伙伴在问关于原厂商相关问题&#xff0c;今天我们就来简单回答一下&#xff0c;仅供参考&#xff01; 原厂商是什么意思&#xff1f; 原厂商&#xff0c;或称原厂&#xff0c;是指生产特定产品或零部件的原始厂家。 软件原厂商是什么意思&#xff1f; 软件原厂…

QT截屏,截取控件为图片,指定范围截屏三种截屏方式

项目中我们常用到截取屏幕&#xff0c;Qt给我的们多种方式&#xff1a; 主要有以下三种&#xff1a; 截取全屏&#xff1b;截取控件为图片&#xff1b;指定位置截屏三种截屏方式&#xff1b; 1.截取全屏 常用&#xff1a; 实现&#xff1a; QScreen *screen QGuiApplicat…

数据结构(一)C语言补

数据结构 内存空间划分 一个进程启动后&#xff0c;会生成4G的内存空间 0~3G是用户空间(应用层) 3~4G是内核空间(底层) 0~3G 3~4G 所有的进程都会共享3G~4G的内核空间&#xff0c; 但是每个进程会独立拥有0~3G的用户空间。 栈区 存放数据特点 栈区存放数据的申请空间的先后…

面试篇-Redis-2+持久化+过期key删除+内存淘汰

文章目录 前言一、你知道Redis 数据是怎么持久化的1.1 Redis 持久化的方式Rdb&#xff1a;1.1.1 主动备份save 命令&#xff1a;1.1.2 Redis 中使用bgsave 进行Rdb 的持久化 &#xff1a; 1.2 Redis 持久化的方式Aof&#xff1a;1.2.1 使用AOF 模式进行数据存储&#xff1a;1.2…

明星代言方式8种助力品牌占领市场-华媒舍

1. 明星代言的重要性和市场价值 明星代言是一种常见的品牌推广方式&#xff0c;通过联系知名度高的明星来推广产品或服务&#xff0c;从而提升品牌的知名度和美誉度。明星代言能够借助明星的影响力和粉丝基础&#xff0c;将品牌信息传达给更广泛的受众&#xff0c;从而提高销量…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句&#xff0c;从而获取、修改或删除数据库中的数据。 具体细节如下&#xff1a; 攻击向量&…

0059__Winsock套接字不能用 _open_osfhandle()函数映射为一个流文件

Winsock套接字不能用_open_osfhandle()函数映射为一个流文件-CSDN博客

Es结合springboot(笔记回忆)

导包 <!--导入es--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency><groupId>org.springframework.boot<…

【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 48&#xff0c;周六&#xff0c;不能再坚持~ 题目详情 [739] 每日温度 题目描述 739 每日温度 解题思路 前提&#xff1a;寻找任一个元素的右边比自己大的元素的位置 思路&#xff1a;通常…

jboss 7.2

链接: https://pan.baidu.com/s/19PSAy-Wy8DjcUMy94eqWnw 提取码: rgxf 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v3的分享链接: https://pan.baidu.com/s/19PSAy-Wy8DjcUMy94eqWnw 提取码: rgxf 复制这段内容后打开百度网盘手机App…

C++:auto命令的含义

在C中&#xff0c;auto 是一个类型说明符&#xff0c;用于自动推断变量的类型。从C11开始&#xff0c;auto 关键字被引入&#xff0c;使得程序员在声明变量时不必明确指定其类型&#xff0c;编译器会根据初始化表达式自动推断出变量的类型。 使用 auto 的好处之一是它可以使代…

激光雷达避障的优缺点

激光雷达避障技术作为一种先进的传感器技术&#xff0c;在多个领域如自动驾驶、机器人导航、安防监控等中得到了广泛应用。以下是激光雷达避障技术的优缺点分析&#xff1a; 一、优点 1.高精度测量&#xff1a;激光雷达能够精确测量物体的距离和位置&#xff0c;对于需要高精度…

quill编辑器使用总结

一、vue-quill-editor 与 quill 若使用版本1.0&#xff0c;这两个组件使用哪个都是一样的&#xff0c;无非代码有点偏差&#xff1b;若需要使用表格功能&#xff0c;必须使用 quill2.0 版本&#xff0c;因为 vue-quill-editor 不支持table功能。 二、webpack版本问题 在使用 q…