2022.8.6 自定义类型之联合体&枚举

本文详细介绍了联合体和枚举的概念及应用。联合体允许多个成员共享同一块内存空间,适用于不同场景下的数据访问需求;枚举提供了一种定义有序符号常量的方法,增强了代码的可读性和维护性。

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

联合体

概念:也是一种复杂数据类型,用法和结构体几乎没有区别(唯一的不同时联合体中的所有成员共同使用一块空间——最大的成员变量大小的空间,而结构体每个成员都有自己的空间)

联合体的大小:通常情况下,联合体的大小就是最大成员的大小。

        图示:以最大的成员变量的空间为最大。

        但是也要考虑内存对齐对于联合体大小的影响,因此tmp_t类型最大对齐数是4,但是,char[5]占5个字节>4个字节,所以联合体大小应该是4的整数倍,因此是8.

union tmp_t
{
    char name[5];
    int age;
}

        图示:

定义:

union student_t
{
    int sn;
    int age;
    char sex;
    double score;
};

联合体适用场景:

        1.大小端的检测

                                           大端:低地址存高位                小端:低地址存低位

        例:0x00000001        大端:00 00 00 01                  小端:01 00 00 00

        

union tmp_t
{
    int a;
    char b;
};
tmp_t tmp;
tmp.a = 1;
if(tmp.b == 1)
{
    printf("小端");
}

        (解释:因为联合体的所有成员共用同一块空间,所以a=1时,内存中存储的是01 00 00 00(小端)或者00 00 00 01(大端),这时,b占一个字节,所以在内存中b为01或者00,所以,如果b是01则说明该字节序是小端字节序,如果b是00则该字节序是大端字节序。)
         2.在不同场景下适用不同的数据

        当我们设计一个结构体时,一块空间会有多种数据访问方式,但是结构体定义出来是给别人用的,所以我们不知道用户会以什么方式来访问,因此在这种情况下定义联合体。多个成员共用一块空间,但是不同的成员对空间的访问方式不同。

        例:同一块空间中的数据,使用的成员变量不同,则决定了不同的数据访问方式。

union tmp_t
{
    int a;
    double b;
    void *c;
};

枚举

定义:

//宏
#define RED 0
#define BULE 1
#define GREEN 255
#define YELLOW 256
//枚举
enum color_t
{
    RED,
    BLUE,
    GREEN=255,
    YELLOW,
};

        coldr_t叫枚举类型,RED,BLUE,GREEN,YELLOW这都叫枚举常量,本质上是数字,并且默认从0开始,自动向下+1。对上述代码来说,RED=0,BLUE=1,GREEN=255,YELLOW=256。

        枚举相较于宏来说,多了类型校验,让代码更加严谨,调试也更加方便一些,枚举是一个整体定义在一个类型中,更便于代码的阅读理解;而宏则较为繁琐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值