C/C++关键字——union

1.介绍

union 是一种特殊的数据类型,它允许你在同一块内存区域中存储不同的数据类型。它的主要目的是节省内存,尤其是在处理多种可能的数据类型,但一次只使用其中一种的场景。

2.特点

struct(结构体)不同,结构体的每个成员都拥有自己独立的内存空间,而联合的所有成员都共享同一段内存。这意味着,你给一个成员赋值,会覆盖其他成员的值(因为它们都使用相同的内存起始地址)。

一个联合的大小至少等于其最大成员的大小,以确保能容纳下任何一个成员。

3.使用方式

cpp 复制代码
union UnionName {
  member_type1 member1;
  member_type2 member2;
  member_type3 member3;
  // ...
};

4.例子

cpp 复制代码
#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.i : 10

  // 使用浮点数成员 - 这会覆盖 i 的内存
  data.f = 220.5;
  printf("data.f : %.2f\n", data.f); // 输出: data.f : 220.50
  // 此时再读取 data.i 将是无意义的值(是浮点数 220.5 的二进制解释)
  printf("data.i (after setting f) : %d (nonsense)\n", data.i);

  // 使用字符数组成员 - 这会覆盖之前所有的内存
  strcpy(data.str, "C Programming");
  printf("data.str : %s\n", data.str); // 输出: data.str : C Programming
  // 此时读取 i 或 f 都将是无意义的值
  printf("data.i (after setting str) : %d (nonsense)\n", data.i);
  printf("data.f (after setting str) : %.2f (nonsense)\n", data.f);

  return 0;
}

输出结果:

cpp 复制代码
data.i : 10
data.f : 220.50
data.i (after setting f) : 1100006400 (nonsense)
data.str : C Programming
data.i (after setting str) : 1819043147 (nonsense)
data.f (after setting str) : 9129985281638201200000000000000.00 (nonsense)
相关推荐
wuminyu7 分钟前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人14 分钟前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒26 分钟前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼30 分钟前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
木喃的井盖33 分钟前
无锁队列细节
c++·工程
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:输出亲朋字符串
c++·字符串·csp·高频考点·信奥赛·专项训练·输出亲朋字符串
Navigator_Z1 小时前
LeetCode //C - 1033. Moving Stones Until Consecutive
c语言·算法·leetcode
WBluuue1 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
小郑加油2 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦2 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw