当前位置: 首页 > java >正文

14、C 语言联合体和枚举知识点总结

联合体和枚举的基本概念、语法、初始化、引用方式及实际应用等方面

一、联合体(共用体)

1. 基本概念与特性

  • 定义:联合体(union)是一种自定义数据类型,其所有成员共用同一块内存空间,同一时刻只有一个成员有效。
  • 与结构体的本质区别:结构体成员各自占用独立内存,联合体成员共享内存。
  • 核心特性
    • 联合体的尺寸等于其最大成员的尺寸(需满足地址对齐)。
    • 给一个成员赋值会覆盖其他成员的值(内存共享导致)。
    • 成员间呈 “互斥” 关系,某一时刻仅能使用一个成员。

2. 定义与语法

union 联合体标签 {

    数据类型 成员1;

    数据类型 成员2;

    // ... 更多成员

};

  • 联合体标签:用于区分不同联合体(可省略,省略后无法通过标签定义变量)。
  • 成员:可为任意数据类型(基本类型、数组、指针等)。

示例

// 定义一个包含多种数据类型的联合体

union data {

    char c;    // 1字节

    int i;     // 4字节

    double d;  // 8字节

};

3. 初始化与引用

初始化
  • 只能初始化一个成员(多个初始化会被覆盖,编译器会警告)。
  • 支持普通初始化和指定成员初始化,最终仅最后赋值的成员有效。

示例

union data u1 = {'A'};  // 普通初始化,仅c有效

union data u2 = {.i = 100};  // 指定成员初始化,仅i有效

union data u3 = {.d = 3.14, .c = 'B'};  // 仅c有效(覆盖d)

引用
  • 通过 “.” 运算符访问普通联合体变量成员。
  • 通过 “->” 运算符访问联合体指针变量成员。
  • 实际应用中常作为结构体成员,表达互斥属性(如学生成绩可表示为等级、分数或文字描述)。

示例

// 联合体作为结构体成员

typedef struct student {

    char name[50];

    union score {  // 成绩的三种互斥表示

        char grade;  // 等级(A/B/C)

        int points;  // 分数(0-100)

        char desc[20];  // 描述(优秀/良好)

    } score;

} Student;

int main() {

    Student stu;

    stu.score.points = 90;  // 使用分数表示成绩

    printf("分数:%d\n", stu.score.points);

    stu.score.grade = 'A';  // 覆盖分数,使用等级表示

    printf("等级:%c\n", stu.score.grade);

    return 0;

}

4. 内存布局与尺寸计算

  • 内存共享:所有成员从同一地址开始存储,尺寸由最大成员决定(需满足地址对齐)。
  • 尺寸计算:联合体尺寸 = 最大成员的尺寸(若最大成员尺寸不满足系统对齐要求,需填充至对齐尺寸)。

示例

union example {

    char arr[5];  // 5字节

    int num;      // 4字节(32位系统对齐尺寸4)

};

// 尺寸为5字节(最大成员为arr,5字节,满足1字节对齐)

printf("联合体尺寸:%lu\n", sizeof(union example));  // 输出5

二、枚举

1. 基本概念与特性

  • 定义:枚举(enum)是一种用户定义的整数类型,用有意义的标识符表示离散的整数值,提高代码可读性。
  • 本质:枚举常量本质是整数,C 语言中枚举变量可直接当作整数使用(无严格类型检查)。
  • 核心特性
    • 枚举常量默认从 0 开始递增,可显式赋值修改。
    • 枚举变量的取值范围为枚举常量列表中的值(但 C 语言不强制检查,可赋值任意整数)。

2. 定义与语法

enum 枚举标签 {

    常量1,

    常量2 = 初始值,

    // ... 更多常量

};

  • 枚举标签:用于区分不同枚举类型(可省略,省略后无法通过标签定义变量)。
  • 枚举常量:标识符表示的整数值,未显式赋值则在前一个常量值基础上加 1。

示例

// 定义颜色枚举

enum color {

    RED,    // 默认为0

    GREEN = 2,  // 显式赋值2

    BLUE    // 前一个值+1,为3

};

// 无标签枚举(仅能在定义时声明变量)

enum {

    MON, TUE, WED, THU, FRI, SAT, SUN  // 0-6,代表星期

} weekday;

3. 初始化与使用

  • 枚举变量定义:通过枚举标签定义变量,可赋值任意枚举常量或整数。
  • 应用场景:表示状态(运行 / 停止)、选项(男 / 女)、错误码等离散值。

示例

// 表示设备状态

enum device_state {

    STOP = 0,

    RUNNING,

    SLEEPING

};

void set_state(enum device_state state) {

    switch (state) {

        case STOP:

            printf("设备停止\n");

            break;

        case RUNNING:

            printf("设备运行\n");

            break;

        case SLEEPING:

            printf("设备休眠\n");

            break;

    }

}

int main() {

    enum device_state dev_state = RUNNING;

    set_state(dev_state);  // 输出“设备运行”

    set_state(3);  // C语言允许,无编译错误(不推荐)

    return 0;

}

4. 与宏定义(#define)的对比

特性

枚举(enum)

宏定义(#define)

类型

有类型(枚举类型)

无类型(纯文本替换)

作用域

局部于枚举标签

全局(从定义处到文件结束)

调试

调试器可识别枚举常量名称

仅显示替换后的数值

自动赋值

支持默认递增赋值

需手动赋值每个常量

结论:枚举在表示相关联的离散值时更优,代码可读性和可维护性更高。

三、总结与实用技巧

  1. 联合体适用场景
    • 表示同一内存的多种解析方式(如数据的不同格式表示)。
    • 节省内存(当多个成员不同时使用时)。
    • 作为结构体成员表达互斥属性(如成绩的多种表示)。
  1. 枚举适用场景
    • 表示有限的离散状态(如运行状态、错误码)。
    • 替代无意义的魔法数字(如用RED代替0)。
    • 提高代码可读性和可维护性。
  1. 注意事项
    • 联合体成员赋值会覆盖其他成员,使用时需确保当前有效成员的正确性。
    • C 语言枚举无严格类型检查,使用时需避免赋值非法整数。
    • 枚举常量可作为switch语句的case标签,增强代码逻辑性。

通过合理使用联合体和枚举,能使代码更简洁、易读且易于维护,尤其在处理复杂数据结构和状态表示时效果显著。

http://www.xdnf.cn/news/17828.html

相关文章:

  • Linux系统Namespace隔离实战:dd/mkfs/mount/unshare命令组合应用
  • 报数游戏(我将每文更新tips)
  • 2022 年全国硕士研究生招生考试真题笔记
  • 杂记 01
  • elasticsearch基础概念与集群部署
  • Blender模拟结构光3D Scanner(一)外参数匹配
  • ARM芯片架构之CoreSight Channel Interface 介绍
  • 20250813测试开发岗(凉)面
  • Spring Security 前后端分离场景下的会话并发管理
  • 商品分类拖拽排序设计
  • 数据结构:队列(Queue)与循环队列(Circular Queue)
  • 【SpringBoot系列-01】Spring Boot 启动原理深度解析
  • 【OpenGL】LearnOpenGL学习笔记07 - 摄像机
  • 《设计模式之禅》笔记摘录 - 15.观察者模式
  • 分布式与微服务宝典
  • Redis基础命令
  • 电商项目微服务架构拆分实战
  • LangGraph 指南篇-基础控制
  • 2025盛夏AI热浪:八大技术浪潮重构数字未来
  • HTML第三次作业
  • C语言相关简单数据结构:顺序表
  • 【深入浅出STM32(1)】 GPIO 深度解析:引脚特性、工作模式、速度选型及上下拉电阻详解
  • IPC Inter-Process Communication(进程间通信)
  • 桌面运维如何深造
  • 算法篇----分治(归并排序)
  • Unity新手制作跑酷小游戏详细教程攻略
  • Python实现点云概率ICP(GICP)配准——精配准
  • 【金仓数据库产品体验官】_从实践看金仓数据库与 MySQL 的兼容性
  • 决策树回归:用“分而治之”的智慧,搞定非线性回归难题(附3D可视化)
  • zookeeper安装部署