【C语言进阶】联合体

1、定义:

是一种特殊的自定义类型,包含一系列成员,联合体也叫共同体,成员共同使用同一块内存空间,用关键字union来命名

union S
{
    char a;
    int b;
};

验证:

通过代码运行发现成员a和b的地址是相同的,共同占用同一块内存空间

2、联合体大小的计算

【1】联合体的大小至少是最大成员的大小(因为联合体至少得有能力存储最大的那个成员)
【2】当最大成员的大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍

eg:最大成员为char a[5],但是联合体的大小不是5,因为最大对齐数为4,而5不是4的整数倍,因此需要浪费3个字节空间,最终计算出联合体大小为8

3、联合体在内存中的存储

【1】由于联合体的成员共同使用同一块内存空间,因此一般不同时使用联合体中的成员,设定初始值最多只能设定一个
【2】根据大小端的不同,在内存中存储顺序有所差异,由于a与b公用一块内存空间,因此后赋值的数据会覆盖前面的数据,赋值顺序不同,数据存储有所差异

(1)先赋值b

(2)先赋值a

4、联合体的使用

判断大小端:

代码表示:

union S
{
    char a;
    int b;
}un;
int main()
{
    un.b = 1;
    //00 00 00 01->大端存储
    //01 00 00 00->小端存储
    if (un.a == 1)
        printf("为小端\n");
    else
        printf("为大端\n");
    return 0;
}
//用函数实现
int check()
{
    union S
    {
        char a;
        int b=1;
    }un;//局部变量只能在函数内部使用
    return un.a;
}

int main()
{
    int ret = check();
    if (ret == 1)//un.a获取第一个字节的内容
        printf("为小端\n");
    else
        printf("为大端\n");
    return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伱恏呀呀呀呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值