联合体 (Union) - "多功能存储盒"

核心概念

联合体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。所有成员共享同一块内存空间。

内存模型演示

内存地址: 0x1000  0x1001  0x1002  0x1003  0x1004  0x1005  0x1006  0x1007
┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
使用 int: │ 字节0 │ 字节1 │ 字节2 │ 字节3 │ │ │ │ │
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘ ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
使用 double: │ 字节0 │ 字节1 │ 字节2 │ 字节3 │ 字节4 │ 字节5 │ 字节6 │ 字节7 │
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘

基本特征

  1. 内存共享:所有成员共用同一内存块
  2. 尺寸最大:联合体大小 = 最大成员的大小 + 内存对齐
  3. 互斥访问:同一时刻只有一个成员有效
  4. 覆盖效应:赋值新成员会覆盖旧成员的值

定义与声明

// 定义联合体类型
union DataBox {
int number;
char letter;
double value;
char text[20];
}; int main() {
// 声明联合体变量
union DataBox box; // 另一种声明方式
union DataBox {
int num;
char ch;
} box1, box2;
}

操作示例

#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); return 0;
}

联合体的高级用法:标签联合体 (Tagged Union)

概念

标签联合体 = 类型标签 + 联合体,用于安全地处理多种数据类型。

// 定义数据类型标签
#define TYPE_INT 1#define TYPE_FLOAT 2
#define TYPE_STRING 3// 标签联合体结构
struct TaggedData {
int type_tag;// 类型标签,指示当前有效的数据类型
union {
int int_data;// 整型数据
float float_data;// 浮点数据
char string_data[50];// 字符串数据
} value;// 联合体存储实际数据};

完整示例

#include <stdio.h>
#include <string.h>
#define TYPE_INT 1
#define TYPE_FLOAT 2
#define TYPE_STRING 3
struct Variant {
int type;
union {
int i;
float f;
char s[20];
} data;
}; void printVariant(struct Variant v) {
switch(v.type) {
case TYPE_INT:
printf("Integer: %d\n", v.data.i);
break;
case TYPE_FLOAT:
printf("Float: %.2f\n", v.data.f);
break;
case TYPE_STRING:
printf("String: %s\n", v.data.s);
break;
default:
printf("Unknown type\n");
}
} int main() {
struct Variant var; // 存储整数
var.type = TYPE_INT;
var.data.i = 100;
printVariant(var); // 存储浮点数
var.type = TYPE_FLOAT;
var.data.f = 3.14;
printVariant(var); // 存储字符串
var.type = TYPE_STRING;
strcpy(var.data.s, "Hello Union");
printVariant(var); return 0;
}

枚举 (Enum) - "有名字的数字"

基本概念

枚举为整数值提供有意义的名称,提高代码可读性和可维护性。

定义与使用

// 定义枚举类型
enum Weekday {
MONDAY,// 默认为0
TUESDAY,// 自动加1
WEDNESDAY,// 2
THURSDAY,// 3
FRIDAY,// 4
SATURDAY,// 5
SUNDAY// 6
}; // 自定义枚举值
enum Status {
OFF = 0,
ON = 1,
STANDBY = 2
}; // 部分自定义
enum Color {
RED,// 0
GREEN = 5,//如果赋值,下一个元素的值会从当前值累加
BLUE,// 6
YELLOW = 10
};

枚举变量操作

#include <stdio.h>
enum TrafficLight { RED, YELLOW, GREEN }; int main() {
enum TrafficLight light = GREEN; switch(light) {
case RED:
printf("Stop!\n");
break;
case YELLOW:
printf("Caution!\n");
break;
case GREEN:
printf("Go!\n");
break;
} // 枚举的本质是整数
printf("RED = %d, GREEN = %d\n", RED, GREEN); return 0;
}

核心思想:联合体用于数据存储的多样性,枚举用于代码逻辑的清晰性

解码C语言复合数据类型之联合体&枚举的更多相关文章

  1. C语言复合数据类型

           C语言数据类型非常丰富,其中结构体的使用非常广泛,也有一点复杂,这一讲我们主要学习结构体的使用方法,同时也会学习到联合.枚举以及typedef的使用,因为结构体最为复杂,使用最广,所以我 ...

  2. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  3. Verilog缺少一个复合数据类型,如C语言中的结构体

    https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...

  4. Go语言入门篇-复合数据类型

    复合数据类型 主要讨论四种类型——数组.slice.map和结构体 数组和结构体聚合类型   --数组和结构体都是有固定内存大小的数据结构 --数组:由同构的元素组成——每个数组元素都是完全相同的类型 ...

  5. C语言的数据类型及其对应变量

    声明,定义和初始化 声明标识符iden是告诉编译器"有这么一个变量var,具体var里是什么,你自己去看".声明只需要标识符的类型和标识符名字,C语言的任何标识符在使用前都需要声明 ...

  6. 谈谈C语言的数据类型

    本文摘要: 本文主要讲述C语言中的数据类型,从基本的数据类型到派生的数据类型,从int ,char ,float double ....到指针,数组,函数,指向指针的指针,指向数组的指针,指向函数的指 ...

  7. 「C语言」数据类型及混合运算与类型转换

    深入学习C语言时,有必要先了解一下数据类型的概念,以及它们之间的混合运算与类型转换. 本篇文章便是根据<C语言程序设计教程>和在线翻阅资料后整理而出.(练习题将逐步更新) 目录:     ...

  8. C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)

    C/C++复合数据类型 壹(数组.结构) 数组 数组的意义.定义与创建 一.二维数组应用 字符数组与字符串处理函数 数组与指针---关系密切 数组的意义与定义创建 意义:反映数据间的特点(通过把同一类 ...

  9. Chisel3 - 复合数据类型

    https://mp.weixin.qq.com/s/rXYqiZKuBpAYL8R94zxgRA   Chisel允许用户根据需要,把基本数据类型组合成为复合数据类型使用.如C语言里面的结构体,这样 ...

  10. 05 C语言的数据类型

    C语言的数据类型 在C 中,数据类型是用来声明不同类型的变量或函数的一个广泛的概念.变量的数据类型决定了变量存储占用的空间大小,以及如何去解释存储的位模式. C 中的数据类型可分为以下几大类: 序号 ...

随机推荐

  1. 4G DTU连接阿里云

    随着物联网平台的应用越来越广泛,越来越多的用户需求数据通过4G DTU传到阿里云,然后用户从阿里云上实时获取需要的数据,本文介绍卓岚设备ZLAN8305/ZLAN5144J如何通过MQTT功能和JSO ...

  2. HTML+CSS+JS日常问题和技巧1(删除某select下除第一个以外的option、双击删除本身、select的change()方法失效问题、实现div高度随背景图片的大小进行改变、实现禁止右键和键盘按键,以打开控制台为例)

    1.删除某select下除第一个以外的option: 1 $("#selectId option:not(:first)").remove() 2.JS实现双击事件(双击删除本身) ...

  3. 如何在FastAPI中玩转STOMP协议升级,让你的消息传递更高效?

    扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 1. STOMP协议基础 STO ...

  4. java 背景颜色更改

    简介 java 事件处理机制 code /* * @Author: your name * @Date: 2020-10-28 22:38:26 * @LastEditTime: 2020-10-29 ...

  5. 【笔记】记录NHibernate在.net中的使用

    最近在做一个AngularJs的管理平台,后台使用的是.Net Framework 4.5,搭配了NHibernate + Redis + Elasticsearch + Mysql等技术: 在新增接 ...

  6. .NET周刊【7月第2期 2025-07-13】

    国内文章 .Net 下高性能 Socket 的方案 https://zhuanlan.zhihu.com/p/1924520585976849438 简单介绍Socket的数据组成.详细介绍.Net高 ...

  7. constexpr有什么用处?

    constexpr有什么用处 2024/3/30 21:07:25 constexpr 是 C++11 引入的关键字,用于声明一个常量表达式(constexpr expression).常量表达式是在 ...

  8. Nginx反向代理-九五小庞

    location /ris-core-api/ { proxy_pass http://ris-core-backend/; proxy_set_header X-Forwarded-For $pro ...

  9. 如何在FastAPI中玩转GraphQL联邦架构,让数据源手拉手跳探戈?

    扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 使用FastAPI实现GraphQ ...

  10. 8种品牌PLC单片机实现自由格式协议串口通信主站视频教程

    8种品牌PLC单片机实现自由格式协议串口通信主站视频教程 一.罗克韦尔AB Micro850​系列PLC实现自由格式协议串口通信主站视频教程:罗克韦尔AB Micro850系列PLC做ASCII串口通 ...