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)
相关推荐
强化学习与机器人控制仿真5 小时前
RSL-RL:开源人形机器人强化学习控制研究库
开发语言·人工智能·stm32·神经网络·机器人·强化学习·模仿学习
百***48075 小时前
【Golang】slice切片
开发语言·算法·golang
q***92515 小时前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang
仟濹5 小时前
【Java 基础】面向对象 - 继承
java·开发语言
郝学胜-神的一滴5 小时前
Linux命名管道:创建与原理详解
linux·运维·服务器·开发语言·c++·程序人生·个人开发
智者知已应修善业6 小时前
【51单片机普通延时奇偶灯切换】2023-4-4
c语言·经验分享·笔记·嵌入式硬件·51单片机
2501_941623326 小时前
C++高性能网络服务器与epoll实战分享:大规模并发连接处理与事件驱动优化经验
开发语言·php
晚风(●•σ )6 小时前
C++语言程序设计——11 C语言风格输入/输出函数
c语言·开发语言·c++
likuolei6 小时前
XML 元素 vs. 属性
xml·java·开发语言
X***48966 小时前
C源代码生成器
c语言·开发语言