c语言,自定义类型:联合体和枚举

联合体:

1.联合体类型的声明

当我们需要在程序中存储不同类型的数据,但又不想占用过多的内存空间时,联合体类型就可以派上用场。联合体类型的声明可以通过以下方式完成:

在C语言中,我们可以使用union关键字来声明联合体类型。下面是一个简单的示例:

union MyUnion 
{
    int intValue;
    float floatValue;
    char stringValue[20];
};

 

2.联合体的特点

  1. 存储不同类型的数据:联合体可以存储多种不同数据类型的值,但在任意时刻只能存储其中一种类型的数据。这使得联合体能够灵活地存储不同类型的数据,节省内存空间。

  2. 共享内存空间:联合体的成员变量共享同一块内存空间。因为联合体在任意时刻只能存储其中一种类型的数据,所以它的大小由其中占用空间最大的成员决定。这也意味着在同一时间只能使用其中的一个成员,因为改变一个成员的值可能会影响其他成员的值。

  3. 用于节省内存空间:联合体常用于需要节省内存空间的情况,例如在嵌入式系统或者对内存占用有严格要求的环境中。通过联合体,可以在不同类型的数据之间共享同一块内存空间,从而减少内存的占用。

  4. 适用于数据转换:联合体也常用于需要在不同类型数据之间进行转换的情况。通过存储不同类型的数据在同一块内存中,可以方便地进行数据类型的转换,提高程序的灵活性和效率。

看一段代码:

#include 

// 定义一个联合体
union MyUnion 
{
    int intValue;
    float floatValue;
    char stringValue[20];
};

int main()
 {
    union MyUnion u;

    u.intValue = 10;  // 存储int类型数据
    printf("Integer value: %d\n", u.intValue);

    u.floatValue = 3.14;  // 存储float类型数据,覆盖之前的int值
    printf("Float value: %f\n", u.floatValue);

    // 存储字符串,覆盖之前的float值
    strcpy(u.stringValue, "Hello, Union!");
    printf("String value: %s\n", u.stringValue);

    // 访问其他成员会出现问题,因为之前的赋值已经覆盖了内存
    printf("Integer value: %d\n", u.intValue);  // 未定义行为,可能输出意外结果

    return 0;
}

这段代码体现了联合体的特点:能够存储不同类型的数据,但在任意时刻只能存储其中一种类型的数据,且会共享同一块内存空间。


3.联合体大小的计算

当计算联合体的大小时,其大小取决于联合体中包含的最大成员的大小。来看一段代码:

#include 

union MyUnion 
{
    int intValue;
    float floatValue;
    char stringValue[20];
};

int main()
 {
    union MyUnion myUnion;
    printf("Size of int: %lu bytes\n", sizeof(int));
    printf("Size of float: %lu bytes\n", sizeof(float));
    printf("Size of char array: %lu bytes\n", sizeof(char[20]));
    printf("Size of union: %lu bytes\n", sizeof(union MyUnion));
    return 0;
}

结果展示: 

c语言,自定义类型:联合体和枚举_第1张图片

 当你运行这段代码时,你会看到联合体的大小是其成员中最大的那个。这是因为联合体在任意时刻只能存储其中一个成员的值,因此为了能够容纳联合体中的最大成员,联合体的大小就等于最大成员的大小。


枚举类型: 

1.枚举类型的声明

枚举类型是一种用户定义的数据类型,用于定义一个数值集合。在许多编程语言中,枚举类型可以通过关键字来声明。例如,在C语言中可以使用enum关键字来声明枚举类型。

enum Days 
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
};

2.枚举类型的优点和如何使用

当使用枚举类型时,可以通过有意义的枚举值来提高代码的可读性和可维护性。

例如:

#include 

// 定义枚举类型表示一周中的每一天
enum Days 
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
};

int main()
 {
    // 使用枚举值来表示一周中的每一天
    enum Days today = Wednesday;

    // 根据枚举值进行相关操作
    switch(today) 
{
        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");
    }

    return 0;
}

在上面的代码中,我们首先使用enum关键字定义了一个枚举类型Days,其中包含了一周中的每一天。然后在main函数中,我们声明了一个枚举类型的变量today,并将其赋值为Wednesday。接着使用switch语句根据枚举值进行判断,输出对应的信息。最后,我们输出了枚举值对应的整数值。

 9c390aaba26d4f8bb4f15b0a48dc4430.png

 

你可能感兴趣的:(c语言,c语言,算法)