C - 枚举和联合体

文章详细介绍了C语言中的枚举(enum)类型,包括定义、初始化、赋值及其优点,如增加代码可读性和可维护性,以及类型检查。同时,文章也探讨了联合体(union)的特性,如成员共享内存空间,联合体大小的计算,并展示了如何利用联合体进行大小端判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

枚举

枚举类型的定义

enum tag//枚举类型名称
{
    member_one,//枚举常量
    member_two,
    /* ………… */
};

例如:

#include <stdio.h>
enum sex
{
    male,//默认值为0 //可以写成 male=4 这样来修改赋值
    female,//默认值为1,依次类推
};
int main()
{
    enum sex s = male;//枚举初始化&赋值
    s = female;//赋值时不能直接赋值整型
    return 0;
}
enum tag_one
{
    one,//0
    two,//1
    three,//2
};
enum tag_two
{
    one = 3,//3
    two,//4
    three,//5
};
enum tag_three
{
    one,//0
    two = 7,//7
    three,//8
};

枚举优点

  • 增加了代码的可读性和可维护性

  • 和 #define 定义的标识符相比,枚举有类型检查,更加严谨

  • 防止了命名污染

  • 便于调试

  • 使用方便,一次可定义多个常量

联合体/共用体

联合体类型的定义

联合体是自定义类型,定义的变量包含一系列成员,所有成员共用同一块空间

union tag
{
    /* member_list */
}/* varible_list */; //声明类似于结构体,也可以声明一个匿名联合体

例如:

#include <stdio.h>
union tag
{
    int a;
    char b;
    double c;
};
int main()
{
    union tag u = { .a = 10 };//初始化
    printf("%zd\n", sizeof(u));//联合体变量的大小至少是最大成员的大小
    printf("%p\n", &(u)); //这4个地址全都相同
    printf("%p\n", &(u.a));
    printf("%p\n", &(u.b));
    printf("%p\n", &(u.c));
    return 0;
}

联合体的特点

联合体的成员共用同一块内存空间,联合体变量的大小至少是最大成员的大小
使用联合体时只能使用其中一个成员变量

联合体大小的计算

  • 联合体变量的大小至少是最大成员的大小

  • 当最大成员大小不是最大对齐数整数倍时,就要对齐到最大对齐数的整数倍

#include <stdio.h>
union tag
{
    int a;//自身大小为4 - 默认对齐数为8 - 对齐数(较小值)为4
    char arr[5];//自身大小为5,元素类型为char,char大小为1 - 默认对齐数为8 - 对齐数为1
    //5不是4的整数倍,则此联合体的大小为8,多的3个字节浪费掉
};
int main()
{
    union tag u;
    printf("%zd\n", sizeof(u));
    return 0;
}

联合体的运用

大小端的判断

一般法和函数法

#include <stdio.h>
int check()
{
    union tag
    {
        char a;
        int b;
    }u;
    u.b = 1; //当b为1时,大端存储为00 00 00 01;小端存储为01 00 00 00,而a占其中第一个字节
    return u.a;
    //返回0表示大端
    //返回1表示小端
}
int main()
{
    int c = check();
    printf("%d\n", c);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值