【C语言进阶】—— 结构体总结(位段 、枚举、公用体)(下)

简介: 【C语言进阶】—— 结构体总结(位段 、枚举、公用体)(下)

⌚四、共用体

什么是共同体?

共用体也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员特征是这些成员共用同一块空间(有的书籍也会将共用体称为联合体)。

比如∶

#include<stdio.h>
    //共用体类型的声明
    union Un
{
    char c;
    int i;
};
int main()
{
    union Un u;
    printf("%d\n", sizeof(u));
    printf("%d\n", sizeof(u.c));
    printf("%d\n", sizeof(u.i));

    printf("%p\n", &u);
    printf("%p\n", &(u.c));
    printf("%p\n", &(u.i));
    return 0;
}

【C语言进阶】—— 结构体总结(位段 、枚举、公用体)_共用体_23

内存分析

【C语言进阶】—— 结构体总结(位段 、枚举、公用体)_位段_24


共用体的特点

共用体的成员是共用同一块内存空间的,这样一个共用体变量的大小,至少是最大成员的大小(因为共用体至少得有能力保存最大的那个成员)。


共用体大小的计算

1.共用体的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

举例:

#include<stdio.h>
union u1
{
    char ch[5];
    int i;
};
union u2
{
    short s[7];
    int i;
};
int main()
{
    printf("%d\n", sizeof(union u1));
    printf("%d\n", sizeof(union u2));
    return 0;
}

分析:

u1中数组ch有5个元素,大小为5个字节,那么u1大小为5,但是因为5不是最大对齐数4(int)的倍数,对齐到最大对齐数4后大小为8。
u2中数组s有7个元素,大小为7 * 2 = 14个字节,14不是最大对齐数4的倍数,对齐到4的倍数后大小为16。

结果展示:

【C语言进阶】—— 结构体总结(位段 、枚举、公用体)_共用体_25


共用体的应用举例

利用共用体的特点,我们可以用来判断计算机的大小端字节序

#include<stdio.h>
union u1
{
    char ch;
    int i;
};

int main()
{
    union u1 a;
    a.i = 1;
    if (a.ch == 1)
        printf("小端字节序\n");
    else
        printf("大端字节序\n");
    return 0;
}

【C语言进阶】—— 结构体总结(位段 、枚举、公用体)_共用体_26


【C语言进阶】—— 结构体总结(位段 、枚举、公用体)_枚举_27


目录
相关文章
|
1天前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
15 7
|
21小时前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
4 0
|
1天前
|
存储 C语言 C++
【C语言刷题系列】水仙花数的打印及进阶
【C语言刷题系列】水仙花数的打印及进阶
|
1天前
|
存储 编译器 Linux
【c语言】详解结构体
【c语言】详解结构体
3 0
|
1天前
|
C语言
【C语言】:枚举和联合
【C语言】:枚举和联合
6 0
|
4天前
|
编译器 C语言
C语言----自定义类型:联合和枚举
C语言----自定义类型:联合和枚举
|
4天前
|
C语言
C语言---自定义类型:结构体(4)
C语言---自定义类型:结构体
|
4天前
|
编译器 C语言
C语言---自定义类型:结构体(3)
C语言---自定义类型:结构体
|
4天前
|
编译器 Linux C语言
C语言---自定义类型:结构体(2)
C语言---自定义类型:结构体
|
4天前
|
C语言
C语言---自定义类型:结构体(1)
C语言---自定义类型:结构体
13 0