C 语言中的 union
语言 union
2023-09-11 14:18:27 时间
由于 C 语言是强类型语言,不能如同某些语言一样,可以在变量中存储任意元素。所以在有的时候会遇到一些问题。比如你有一个变量需要存储计算结果,计算结果有时可能是整数,有时可能是浮点数。这里我们介绍其中可以做到不更改变量名就可以存储不同类型数据的变量。
1. 声明 union
和之前介绍的 struct
的声明方式是类似的,通过关键字 union
,以及这个 union
的名称,还有一系列的变量类型以及名称。
union Calculation
{
int i;
float f;
char str[100];
};
union Calculation cal1, cal2;
看着结构感觉是不是很熟悉。但是这和 struct
有着本质的不同。之前的 struct
是一个集合,里面的变量之间是独立的。而这个 union
则正好相反,这不是一个集合,而只是一个特殊的变量,是一个,不是多个。只不过这个变量可以在其声明包含的这些变量类型之间变化。一次只能有一个内部的变量类型被赋值,如果多次赋值,那么最后一次的赋值会覆盖前面的变量内容。
2. 初始化 union
初始化一个 union
和初始化一个变量是一致的,只能初始化里面其中一个值,一般默认形式是初始化其中的第一个值。
union Calculation cal1 = 1;
3. 使用 union
使用一个 union
变量需要使用成员访问符,也就是英文句号 .
。
cal1.i = 1;
4. 示例程序
#include <stdio.h>
#include <string.h>
int main()
{
union Calculation {
int i;
float f;
char str[100];
};
union Calculation cal1 = {1};
printf("cal1.i: %d, cal1.f: %f, cal1.str: %s\n", cal1.i, cal1.f, cal1.str);
cal1.f = 0.111;
printf("cal1.i: %d, cal1.f: %f, cal1.str: %s\n", cal1.i, cal1.f, cal1.str);
strcpy(cal1.str, "None");
printf("cal1.i: %d, cal1.f: %f, cal1.str: %s\n", cal1.i, cal1.f, cal1.str);
return 0;
}
运行结果:
cal1.i: 1, cal1.f: 0.000000, cal1.str:
cal1.i: 1038308344, cal1.f: 0.111000, cal1.str: S=
cal1.i: 1701736270, cal1.f: 70373527000468267466752.000000, cal1.str: None
在这个示例中我们展示了其用法。可以看到初始化的时候只能给第一种类型的变量赋值,后面的每次赋值都会覆盖其他类型的值。所以只有最后一次的赋值的类型是可以使用的。这和之前介绍的 struct
是完全不同的。
5. 小结
到这里可能有些同学不解其中缘由,其实不复杂,主要是两个在内存的存储分配上是不同的。之前的 struct
是给每一种类型的变量都存储的存储空间,而 union
则只是按照类型里需要内存最多的类型分配了一个内存存储位置。因为只有一个存储位置,所以就会出现后面的会覆盖掉之前存储的内容的情况。
相关文章
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系
- 全面了解JavaScript语言
- 《R语言数据挖掘》----1.2 数据源
- Apache Storm 官方文档 —— 使用非 JVM 语言开发
- 第二十一节:Java语言基础-关键字,标识符,注释,常量和变量,运算符
- Facebook Meta 以其最先进的基础语言模型 LLaMA 升温 AI 竞赛(含项目源码)
- 语言混编总结二
- 为什么一定要调用 setlocale 呢? 因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集。使用setlocal改变整个应用程序的字符集编码方式(wcstombs使用前要设置 setlocale (LC_ALL, "chs"); )
- 《R的极客理想—工具篇》—— 1.7 R语言的高质量图形渲染库Cairo
- R语言基础题及答案(二)——R语言与统计分析第二章课后习题(汤银才)
- 【历史上的今天】8 月 27 日:第一个面向对象编程语言创造者诞生;IE 衰亡起点;IBM研制世界最小计算机逻辑电路
- 【历史上的今天】12 月 17 日:词汇 Weblog 被创造;APL 语言发明人诞生;人类飞上天空
- R语言入门:矩阵和数组的运算
- 2-8 R语言基础 日期与时间
- D1net阅闻:Google发布了能理解人类语言的云服务
- GO语言基础之struct