0%

枚举和共用体

文章时效性提示

本文发布于 505 天前,部分信息可能已经改变,请注意甄别。

枚举

枚举就是一一列举
比如:一周有7天、性别有男女、一个月有30天,都可以一一列举

枚举类型的定义

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
enum Sex//枚举类型
{
    Male,
    Female,
    Secret//枚举的可能取值 - 常量
};
int main() {
    enum Sex s = Male;//这里只能赋Male、Female、Secret规定的三个值
    printf("%d,%d,%d",Male,Female,Secret);//打印的结果是0,1,2
    return 0;
}

枚举的优点

枚举相比#define的优点有哪些?

  • 增加代码的可读性和可维护性
  • 和#define定义的标识符比较,枚举有类型检查,更严谨。(define只是替换)
  • 防止命名污染
  • 便于调试
  • 使用方便,一次可以定义多个变量

联合(共用体)

联合也是一种特殊的自定义类型,这种类型定义的变量也包含了一系列的成员,特征是这些成员共用一块空间(所以联合也叫共用体)

联合类型的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
union Un
{
    char c;
    int i;
};

int main()
{
    union Un u;
    printf("%d\n",sizeof(u));//4
    printf("%p\n",&u);//0x16fdff1c8
    printf("%p\n",&(u.c));//0x16fdff1c8
    printf("%p\n",&(u.i));//0x16fdff1c8
    return 0;
}

上面可以知道,u这个联合变量,占4字节,并且u里面的int和char类型的地址是一样的。

联合的特点

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

判断当前计算机的大小端存储:

参考:大小端介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
int check_sys()
{
    union Un
    {
        char c;
        int i;
    }u;
    u.i = 1;
    //返回1,小端
    //返回0,大端
    return u.c;
}
int main()
{
    int a = 1;
    int ret = check_sys();
    if (1 == ret)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }
    return 0;
}

联合大小的计算

  • 联合大小最小是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,对齐到最大对齐数的整数倍。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    union Un
    {
        int a;
        char arr[5];
    };

    int main()
    {
        union Un u;
        printf("%d\n",sizeof(u));//8
        return 0;
    }
    u的大小是8,是由于字符型的数组arr占5个字节,浪费3字节,对齐到8字节,是最大的成员,占8字节。