12.Union 结构

简介: 12.Union 结构

十二、Union 结构

有时需要一种数据结构,不同的场合表示不同的数据类型。比如,如果只用一种数据结构表示水果的“量”,这种结构就需要有时是整数(6个苹果),有时是浮点数(1.5公斤草莓)。

C 语言提供了 Union 结构,用来自定义可以灵活变更的数据结构。它内部可以包含各种属性,但同一时间只能有一个属性,因为所有属性都保存在同一个内存地址,后面写入的属性会覆盖前面的属性。这样做的最大好处是节省空间。

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

上面示例中, union 命令定义了一个包含三个属性的数据类型 quantity 。虽然包含三个属性,但是同一时间只能取到一个属性。最后赋值的属性,就是可以取到值的那个属性。


使用时,声明一个该类型的变量。

使用时,声明一个该类型的变量。
// 写法一
union quantity q;
q.count = 4;
// 写法二
union quantity q = {.count=4};
// 写法三
union quantity q = {4};

上面代码展示了为 Union 结构赋值的三种写法。最后一种写法不指定属性名,就会赋值给第一个属性。执行完上面的代码以后, q.count 可以取到值,另外两个属性取不到值。

printf("count is %i\n", q.count); // count is 4
printf("weight is %f\n", q.weight); // 未定义行为

如果要让 q.weight 属性可以取到值,就要先为它赋值。

q.weight = 0.5;
printf("weight is %f\n", q.weight); // weight is 0.5

一旦为其他属性赋值,原先可以取到值的 q.count 属性就不再有效了。除了这一点,Union 结构的其他用法与 Struct 结构,基本上是一致的。

Union 结构也支持指针运算符 -> 。

union quantity {
  short count;
  float weight;
  float volume;
};
union quantity q;
q.count = 4;
union quantity* ptr;
ptr = &q;
printf("%d\n", ptr->count); // 4

上面示例中, ptr 是 q 的指针,那么 ptr->count 等同于 q.count 。

Union 结构指针与它的属性有关,当前哪个属性能够取到值,它的指针就是对应的数据类型。

union foo {
  int a;
  float b;
} x;
int* foo_int_p = (int *)&x;
float* foo_float_p = (float *)&x;
x.a = 12;
printf("%d\n", x.a);           // 12
printf("%d\n", *foo_int_p);    // 12
x.b = 3.141592;
printf("%f\n", x.b);           // 3.141592
printf("%f\n", *foo_float_p);  // 3.141592

上面示例中, &x 是 foo 结构的指针,它的数据类型完全由当前赋值的属性决定。

typedef 命令可以为 Union 数据类型起别名。

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

上面示例中, union 命令定义了一个包含三个属性的数据类型, typedef 命令为它起别名为quantity 。

Union 结构的好处,主要是节省空间。它将一段内存空间,重用于不同类型的数据。定义了三个属性,但同一时间只用到一个,使用 Union 结构就可以节省另外两个属性的空间。Union 结构占用的内存长度,等于它内部最长属性的长度。



目录
相关文章
|
SQL 开发框架 .NET
OA办公自动化系统设计与实现(论文+源码)_kaic
OA办公自动化系统设计与实现(论文+源码)_kaic
|
人工智能 搜索推荐 UED
Bot 商店 + 一键优化提示词 Prompt,开启AI新体验!| Botnow上新
Botnow 迎来了重大更新,新增了 Bot 商店功能,并优化了 Bot 编排,提升了 AI 使用效率。用户可在 Bot 商店中轻松浏览和体验各类官方及用户发布的 Bots,并可一键发布或下架自己的 Bot。此外,还推出了一键优化 Prompt 功能,帮助用户生成清晰、精准的指令,提升对话质量。新老用户快来体验吧![链接]
456 4
|
12月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
12月前
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
JavaScript Java 测试技术
基于SpringBoot+Vue的个人理财系统的设计与实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的个人理财系统的设计与实现(源码+lw+部署文档+讲解等)
213 1
|
Linux
split 的详细用法
【4月更文挑战第13天】split 的详细用法
290 9
|
存储 Linux 网络安全
杨校老师课堂之云计算私有云OpenStack框架快速搭建
杨校老师课堂之云计算私有云OpenStack框架快速搭建
438 0
|
存储 Prometheus 监控
InfluxDB和 Prometheus
【5月更文挑战第13天】InfluxDB和 Prometheus
795 10
|
前端开发 JavaScript UED
CSS Transition(过渡效果)详解
CSS Transition(过渡效果)详解
1115 1
|
安全
如何使用虚拟信用卡在OnlyFans上订阅和支付 - 完全指南
本文将指导你如何使用虚拟信用卡在OnlyFans上订阅和支付,让你轻松解锁心仪创作者的独家内容。
5314 0

热门文章

最新文章