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

C语言自定义类型:联合与枚举详解

在C语言的世界里,自定义类型就像是一个神奇的工具箱,里面装着各种各样的工具,帮助我们更灵活地处理各种数据。今天,我将带你深入了解C语言自定义类型中的联合与枚举,它们就像是工具箱里的瑞士军刀,小巧却功能强大,能让新手也能轻松驾驭复杂的数据处理任务。

 

 

联合体:共享内存的魔术师

 

 

联合体类型的声明

 

联合体(`union`)是一个特殊的自定义类型,它允许将多个不同类型的变量存储在同一个内存位置。这就好比一个魔术师的百宝箱,虽然箱子的大小是固定的,但魔术师可以变出各种不同类型的物品。联合体的声明方式与结构体类似,但它的关键词是`union`。

 

union Un {

    char c;

    int i;

};

 

在这个例子中,我们声明了一个名为`Un`的联合体类型,它可以存储一个字符(`char`)或一个整数(`int`)。但要记住,联合体在同一时间只能存储其中一种类型的数据。

 

 

联合体的特点

 

联合体的最大特点是它的所有成员共享同一块内存空间。这意味着,当你给联合体的一个成员赋值时,其他成员的值也会随之改变。这就好比一个杯子,你可以用它来装热水,也可以用它来装冷水,但你不能同时装两种水。

 

#include <stdio.h>

 

int main() {

    union Un {

        char c;

        int i;

    } myUnion;

 

    myUnion.c = 'A';

    printf("As a char: %c\n", myUnion.c); // 输出:As a char: A

 

    myUnion.i = 65;

    printf("As an int: %d\n", myUnion.i); // 输出:As an int: 65

 

    // 注意:此时myUnion.c的值也会变为对应的字符

    printf("Now as a char: %c\n", myUnion.c); // 输出:Now as a char: A

 

    return 0;

}

 

在这个例子中,我们首先将字符`'A'`赋值给联合体的`c`成员,然后打印出来。接着,我们将整数`65`赋值给联合体的`i`成员,并打印出来。最后,我们再次打印`c`成员的值,发现它也变成了`'A'`,因为联合体的内存是共享的。

 

 

联合体大小的计算

 

联合体的大小由其最大成员的大小决定。例如,在上面的例子中,`char`类型通常占用1个字节,而`int`类型通常占用4个字节。因此,联合体`Un`的大小将是4个字节,以适应其最大的成员`i`。

 

printf("Size of union Un: %zu\n", sizeof(union Un)); // 输出:Size of union Un: 4

 

 

枚举:有序的标签集合

 

 

枚举类型的声明

 

枚举(`enum`)是一种为整数常量赋予名称的自定义类型。这就好比给一组数字贴上标签,让它们更容易理解和使用。枚举的声明方式如下:

 

enum Weekday {

    MONDAY,

    TUESDAY,

    WEDNESDAY,

    THURSDAY,

    FRIDAY,

    SATURDAY,

    SUNDAY

};

 

在这个例子中,我们声明了一个名为`Weekday`的枚举类型,它包含了一周七天的名称。每个枚举成员都有一个对应的整数值,如果没有显式指定,默认情况下,第一个枚举成员的值为0,后续成员依次加1。

 

 

枚举类型的特点

 

枚举的主要优点是它提高了代码的可读性和可维护性。使用枚举可以让代码更加直观,避免直接使用魔法数字(难以理解的数字常量)。

 

#include <stdio.h>

 

int main() {

    enum Weekday day = TUESDAY;

    printf("Today is %d\n", day); // 输出:Today is 1

 

    if(day == FRIDAY) {

        printf("It's Friday!\n");

    } else {

        printf("It's another day.\n"); // 输出:It's another day.

    }

 

    return 0;

}

 

在这个例子中,我们声明了一个`Weekday`类型的变量`day`,并将其赋值为`TUESDAY`。通过打印`day`的值,我们可以看到它对应的整数值是1。然后我们通过一个简单的条件判断来演示枚举的使用。

 

 

枚举类型的使用

 

枚举类型在实际编程中非常有用,特别是在需要处理一组固定的选项时。例如,我们可以使用枚举来表示菜单选项、状态码等。

 

enum MenuOption {

    OPTION_ADD,

    OPTION_REMOVE,

    OPTION_UPDATE,

    OPTION_EXIT

};

 

void processOption(enum MenuOption option) {

    switch(option) {

        case OPTION_ADD:

            printf("Adding...\n");

            break;

        case OPTION_REMOVE:

            printf("Removing...\n");

            break;

        case OPTION_UPDATE:

            printf("Updating...\n");

            break;

        case OPTION_EXIT:

            printf("Exiting...\n");

            break;

    }

}

 

int main() {

    processOption(OPTION_ADD); // 输出:Adding...

    processOption(OPTION_EXIT); // 输出:Exiting...

    return 0;

}

 

在这个例子中,我们定义了一个`MenuOption`枚举类型,用于表示菜单的不同选项。然后我们编写了一个`processOption`函数,根据传入的枚举值执行不同的操作。在`main`函数中,我们演示了如何调用这个函数。

 

总结

 

联合体和枚举是C语言中两个非常实用的自定义类型。联合体允许我们在同一块内存中存储不同类型的数据,这在需要高效利用内存的场景中非常有用。枚举则通过为整数常量赋予名称,提高了代码的可读性和可维护性。通过本文的讲解,希望你对联合体和枚举有了更深入的理解,并能够在实际编程中灵活运用它们。

 

现在你对联合体和枚举的理解如何呢?在学习过程中,你遇到了哪些疑问或者有趣的发现?欢迎在评论区留言分享,让我们一起交流学习心得!

相关文章:

  • 手撕基于AMQP协议的简易消息队列-2(所用第三方库的介绍与简单使用)
  • 【MCP】为什么使用Streamable HTTP: 相比SSE的优势与实践指南
  • 【SpringMVC】详解cookie,session及实战
  • ping_test_parallel.sh 并行网络扫描脚本
  • (leetcode) 力扣100 7.接雨水(两种非官解,三种官解,对官解进一步解释)
  • QT实现曲线图缩放、拖拽以及框选放大
  • 【特别版】Kubernetes集群安装(1master,2node)
  • docker 安装 sqlserver2022 和注意点
  • 长事务:数据库中的“隐形炸弹“——金仓数据库运维避坑指南
  • P2415 集合求和 详解
  • 需求分析阶段测试工程师主要做哪些事情
  • Kubernetes探针生产环境实战指南
  • Linux下部署Keepalived
  • 代理服务器
  • DBeaver查询PostgreSQL的只读模式
  • vue实现半圆转盘旋转(门户网页上)
  • 基于Stable Diffusion XL模型进行文本生成图像的训练
  • 旧版 Flutter 写的项目, 想要在新的环境上运行?
  • ARM 芯片上移植 Ubuntu 操作系统详细步骤
  • 【HarmonyOS 5】鸿蒙中进度条的使用详解
  • 英国和美国就关税贸易协议条款达成一致
  • 大四本科生已发14篇SCI论文?学校工作人员:已记录汇报
  • 首批18位!苏联籍抗日航空英烈信息更新
  • 陈丹燕:赤龙含珠
  • 花20万骑自行车?CityRide带火“骑行经济”
  • 夜读丨母亲的手擀面