【C】枚举与共生体

枚举(Enumeration)

概念

枚举是 C 语言中的一种用户自定义数据类型,它用于定义一组命名的整数常量。枚举类型可以提高代码的可读性和可维护性,因为使用有意义的名称来代替数字,使代码更易于理解。

案例

以下是一个简单的枚举示例,用于表示一周的七天:

#include <stdio.h>

// 定义枚举类型 Weekday
enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

// 函数用于打印对应星期几的信息
void printWeekday(enum Weekday day) {
    switch (day) {
        case MONDAY:
            printf("Today is Monday.\n");
            break;
        case TUESDAY:
            printf("Today is Tuesday.\n");
            break;
        case WEDNESDAY:
            printf("Today is Wednesday.\n");
            break;
        case THURSDAY:
            printf("Today is Thursday.\n");
            break;
        case FRIDAY:
            printf("Today is Friday.\n");
            break;
        case SATURDAY:
            printf("Today is Saturday.\n");
            break;
        case SUNDAY:
            printf("Today is Sunday.\n");
            break;
        default:
            printf("Invalid day.\n");
    }
}

int main() {
    // 声明一个枚举类型的变量并初始化为 WEDNESDAY
    enum Weekday today = WEDNESDAY;
    // 调用函数打印信息
    printWeekday(today);

    return 0;
}

代码解释

  1. 枚举类型定义enum Weekday 定义了一个名为 Weekday 的枚举类型,包含了一周七天的名称。默认情况下,MONDAY 的值为 0,TUESDAY 的值为 1,依此类推。
  2. 函数 printWeekday:该函数接受一个 enum Weekday 类型的参数,并根据传入的值使用 switch 语句打印相应的信息。
  3. main 函数:声明一个 enum Weekday 类型的变量 today 并初始化为 WEDNESDAY,然后调用 printWeekday 函数打印信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
枚举类型
    1. 枚举类型每一个元素在没有给予默认值的情况下,第一个元素
        对应的数值为 0,之后的元素逐个递增
    2. **枚举中的元素可以指定数据,之后的数据在没有赋予明确的数值
        下,对应的数据从当前指定数据之后递增**
    3. 枚举中的每一个元素都可以单独赋值
*/
enum Week
{
    SUN,
    MON,
    TUS = 5,
    WEN,
    THU,
    FRI,
    SAT
};

/*
演示案例!不正确,可以利用 十六进制控制二进制数据内容进行调节
利用一个字节数据改变硬件状态。
*/
enum STM_GPIO
{
    GPIO_1 = 0x1,
    GPIO_2 = 0x2,
    GPIO_3 = 0x4,
    GPIO_4 = 0x8,
    GPIO_5 = 0x10,
    GPIO_6 = 0x20
};

int main(int argc, char const *argv[])
{
    printf("SUN : %d\n", SUN);
    printf("SUN : %d\n", MON);
    printf("SUN : %d\n", TUS);
    printf("SUN : %d\n", WEN);
    printf("SUN : %d\n", THU);
    printf("SUN : %d\n", FRI);
    printf("SUN : %d\n", SAT);

    return 0;
}

共用体(Union)

概念

共用体也是一种用户自定义数据类型,它允许在相同的内存位置存储不同的数据类型。共用体的所有成员共享同一块内存空间,因此在同一时间只能使用一个成员。

案例

以下是一个简单的共用体示例,用于存储不同类型的数据:

#include <stdio.h>

// 定义共用体类型 Data
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    // 声明一个共用体类型的变量 data
    union Data data;

    // 存储整数
    data.i = 10;
    printf("data.i: %d\n", data.i);

    // 存储浮点数
    data.f = 220.5;
    printf("data.f: %.2f\n", data.f);

    // 存储字符串
    snprintf(data.str, sizeof(data.str), "Hello");
    printf("data.str: %s\n", data.str);

    return 0;
}

代码解释

  1. 共用体类型定义union Data 定义了一个名为 Data 的共用体类型,包含一个整数 i、一个浮点数 f 和一个字符数组 str
  2. main 函数:声明一个 union Data 类型的变量 data,然后分别存储整数、浮点数和字符串,并打印出相应的值。需要注意的是,每次存储新的数据时,会覆盖之前存储的数据。

#include <stdio.h>

/*
共用体
    1. 共用体占用内存空间大小取决于整个共用体中的占用内存最大数据类型
    2. 共用体空间使用需要主要内存清理问题
    3. 注意共用体内存数据问题
*/
// 定义共用体类型 Data
union Data {
    int int_arr[10]; // 40
    double double_arr[10]; // 80
    char str[40];    // 40
};

int main(int argc, char const *argv[])
{
    printf("sizeof(Data) : %ld\n", sizeof(union Data));

    union Data data;

    /*
    每一次使用共用体,有且只允许使用共用体的一个元素内容
    */
    data.int_arr[5] = 65;
    printf("data.int_arr[0] = %d\n", data.int_arr[0]);
    printf("data.int_arr[1] = %d\n", data.int_arr[1]);
    printf("data.int_arr[2] = %d\n", data.int_arr[2]);
    printf("data.int_arr[3] = %d\n", data.int_arr[3]);
    printf("data.int_arr[4] = %d\n", data.int_arr[4]);
    printf("data.int_arr[5] = %d\n", data.int_arr[5]);
    printf("data.int_arr[6] = %d\n", data.int_arr[6]);

    printf("&data : %p\n", &data);
    printf("&data.int_arr[5] : %p\n", &data.int_arr[5]);

    printf("data.str[20] : %c\n", data.str[20]); // 'A'
    return 0;
}