【手撕C语言基础】联合体与枚举

  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主
  • 快上,一起学习!
  • 送给读者的一句鸡汤:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢

        C语言是一门功能强大且灵活的编程语言,提供了许多特性和工具,使开发人员能够更好地控制和处理数据。在C语言中,联合体枚举是两个重要的概念,它们提供了一种在程序中存储和操作不同类型数据的方式。本文将深入探讨联合体和枚举的概念、语法和用法,并通过实例分析来说明它们的实际应用。

一、联合体

1.联合体基本概念

      
        联合体的外在形式跟结构体非常类似,但它们有一个本质的区别:结构体中的各个成员是各自独立的,而联合体中的各个成员却共用同一块内存,因此联合体也称为共用体,有一种“堆叠”的效果。

【手撕C语言基础】联合体与枚举_第1张图片

 

        联合体的特点如下:

  • 联合体的大小等于其中最大成员的大小,因为联合体中的成员共享同一块内存空间;
  • 联合体各成员之间形成一种“互斥"的逻辑,在某个时刻只有一个成员有效;
  • 联合体的成员可以是不同的数据类型,可以是基本类型(如整数、浮点数、字符等)或自定义类型(如结构体、枚举等)。
  • 给联合体的某个成员赋值,会覆盖其他的成员,使它们失效。

2.联合体的定义语法

        (1)联合体名字:用来区分各个不同的联合体;
       (2) 成员:是包含在联合体内部的数据,可以是任意的数据类型。

union 联合体名字 {
    成员类型 成员1;
    成员类型 成员2;
     ...
};
3.联合体操作


        联合体的操作跟结构体形式上别无二致,但由于联合体特殊的存储特性,不管怎么初始化和赋值,最终都有且仅有一个成员是有效的。

        联合体初始化成员引用联合体指针综合实例:

#include 

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    // 初始化联合体
    union Data data1 = { .i = 10 };
    printf("Value of data1.i: %d\n", data1.i);

    // 成员引用
    data1.f = 3.14;
    printf("Value of data1.f: %.2f\n", data1.f);

    // 联合体指针的使用
    union Data *data2 = &data1;
    data2->i = 20;
    printf("Value of data1.i: %d\n", data1.i);

    return 0;
}

        在上述示例中,我们定义一个名为 Data 的联合体,它有三个成员:整数 、浮点数 f和字符数组 str。然后,使用该联合体进行初始化、成员引用和联合体指针的使用。

二、枚举

1.枚举的概念与特点

         枚举类型的本质是提供一种范围受限的整型,比如用0-6表示七种颜色,用0-3表示四种状态等,但枚举在C语言中并未实现其本来应有的效果,直到C++环境下枚举才拥有原本该有的属性。

        枚举还是C语言中用于定义一组具有离散取值的常量的数据类型。枚举类型可以提高程序的可读性,并提供一种清晰地表示一组相关常量的方式。枚举的特点如下:

  • 枚举类型是用户自定义的数据类型,由一组命名的常量组成。
  • 枚举常量的取值是离散的,每个常量都具有唯一的整数值。
  • 默认情况下,枚举常量的第一个值为0,后续常量的值依次递增。
   2.枚举示例     

        我们定义一个名为 spectrum 的枚举类型,其中包含了颜色的枚举常量。这些常量分别是redorangeyellowgreenbluecyanpurple。我们可以使用这些常量来表示不同的颜色。

        在 main 函数中,我们声明了一个枚举变量 color,并将其初始化为 orange,表示颜色为橙色。然后,我们打印出枚举变量 color 的值。

#include 

enum spectrum {
    red,
    orange,
    yellow,
    green,
    blue,
    cyan,
    purple
};

int main() {
    enum spectrum color = orange;
    printf("Color: %d\n", color);

    return 0;
}

        枚举数据最重要的作用,是使用有意义的单词,来替代无意义的数字,提高程序的可读性。

三、联合体与枚举的综合应用

        下面例程定义了一个结构体Data,其中包含一个枚举类型DataType的成员type联合体类型DataValue的成员value。通过结合使用联合体和枚举,该例程实现了以下功能设计:

  • 枚举类型DataType用于标识数据的类型,其中包含了三个常量:INTEGERFLOATSTRING。这些常量用于表示数据的类型,以便在处理数据时能够正确识别其类型。

  • 联合体类型DataValue用于存储不同类型的数据值,其中包含了三个成员:整数i、浮点数f和字符数组str。这些成员共享同一块内存空间,只能同时存储其中一个成员的值。

  • 结构体Data包含了两个成员:typevaluetype成员用于存储数据的类型,通过枚举常量进行标识。value成员使用联合体类型DataValue来存储具体的数据值。

  • 函数printData用于打印数据的值。根据数据的类型,它通过switch语句选择适当的输出格式并打印数据的值。

        在main函数中,我们创建了三个Data类型的变量data1data2data3,分别表示一个整数、一个浮点数和一个字符串数据。然后,我们调用printData函数来打印这些数据的值,根据数据的类型选择适当的输出格式。

#include 

enum DataType {
    INTEGER,  // 整型
    FLOAT,    // 浮点型
    STRING    // 字符串型
};

union DataValue {
    int i;           // 整数
    float f;         // 浮点数
    char str[20];    // 字符串
};

struct Data {
    enum DataType type;       // 数据类型
    union DataValue value;    // 数据值
};

void printData(struct Data data) {
    switch (data.type) {
        case INTEGER:
            printf("整数: %d\n", data.value.i);
            break;
        case FLOAT:
            printf("浮点数: %.2f\n", data.value.f);
            break;
        case STRING:
            printf("字符串: %s\n", data.value.str);
            break;
        default:
            printf("无效的数据类型。\n");
            break;
    }
}

int main() {
    struct Data data1 = {INTEGER, {.i = 10}};
    struct Data data2 = {FLOAT, {.f = 3.14}};
    struct Data data3 = {STRING, {.str = "Hello"}};

    printData(data1);
    printData(data2);
    printData(data3);

    return 0;
}

四、总结

        在本文中,探讨了C语言中联合体和枚举的概念、语法和用法。通过实例分析展示了联合体和枚举在不同场景下的实际应用。学习和理解联合体和枚举,使我们可以更好地处理和操作不同类型的数据,提高程序的可读性和可维护性。

        希望本文对小白的你在C语言编程中的学习和实践有所帮助~

写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 感谢关注

你可能感兴趣的:(手撕c语言,数据结构)