C语言中枚举与联合体的使用方法(enum union)

时间:2022-01-14 03:38:05

enum的定义

枚举顾名思义就是一一列举,把可能的取值一一列举。

枚举的使用方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//定义一个枚举Color的类型
 
enum Color // enum Color 是一个类型
{
    RED,  //逗号结尾
    GREEN,
    BLUE // 最后一个成员没有逗号没有分号
};
int main()
{
    printf("%d",RED);//0
    printf("%d",GREEN);//1
    printf("%d",BLUE);//2
    return 0;
}

{}中的内容是枚举类型的可能取值,也叫 枚举常量 。 这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。从赋值的地方开始,后面的枚举常量没赋值的话,也是从最后一次枚举常量赋值的地方赋值地方开始依次递增1数值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
enum Color//颜色
{
    RED=1,
    GREEN=2,
    BLUE=4
};
int main()
{
    printf("%d",RED);//1
    printf("%d",GREEN);//2
    printf("%d",BLUE);//4
    return 0;
}

或者这样

?
1
2
3
4
5
6
7
8
9
10
11
12
13
enum Color//颜色
{
    RED=10,
    GREEN,
    BLUE
};
int main()
{
    printf("%d",RED);//10
    printf("%d",GREEN);//11
    printf("%d",BLUE);//12
    return 0;
}

当然枚举是类型还可以定义变量:

这个变量可以赋值枚举常量的可能取值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum Color//颜色
{
    RED=10,
    GREEN,
    BLUE
};
int main()
{
    enum Color c = RED; //定义枚举变量,给它赋值枚举常量的可能取值RED
    printf("%d",c); //10
    c = GREEN;
    printf("%d",c); //11
        //  注意点,枚举常量是常量,所以不可以在使用过程中修改他的值
        //RED = 3; //是错误的
    return 0;
}

enum对比#define宏常量的好处

枚举的优点:

  1. 增加代码的可读性和可维护性;
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨;
  3. 防止了命名污染(封装);
  4. 便于调试;
  5. 使用方便,一次可以定义多个常量。

union的定义

union 是共用体,它的意思就是union 里面成员变量的集合是公用内存空间的。

比如

?
1
2
3
4
5
6
7
8
9
10
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un)); //结果为4

C语言中枚举与联合体的使用方法(enum union)

成员变量 c占用一个字节,成员变量i占用4个字节,但是又一个字节和成员变量重叠了,这就是共用体

联合体大小的计算

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
union Un1
{
    char c[5];
    int i;
};
union Un2
{
    short c[7];
    int i;
};
    //下面输出的结果是什么?
    printf("%d\n", sizeof(union Un1)); //结果为8
    printf("%d\n", sizeof(union Un2));//结果为16

分析:

  • 对于Un1,我们知道Un1的最大对齐数是4,假如没有按对齐数的话,其大小为5,有对齐数,就变为8;
  • 对于Un2,我们知道Un2的最大对齐数是4,假如没有对齐数的话,其大小为14,有对齐数,就变为16;

联合体配合算大小端的问题

记得之前用类型转化的方式计算得到计算机是大小端,现在我们可以用联合体也得到计算机的大小端;

类型转化得到大小端的方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int check()
{
    int a = 1; // 0x 00 00 00 01
    //低地址 ----------------------->高地址
    //小端:01 00 00 00
    //大端:00 00 00 01
    return *(char*)&a;
}
int main()
{
    int ret = check();
    
    if(ret == 1)
        printf("小端模式");
    else
        printf("大端模式");
    
    return 0;
}

联合体的方式

?
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
union Un
{
    char c;
    int i; 
};
int cheak()
{
    u.i = 1;
    //低地址 ----------------------->高地址
    //小端:01 00 00 00
    //大端:00 00 00 01
    
    //如果是小端,返回1,不是返回0
    
    return u.c;
}
int main()
{
    int ret = check();
    
    if(ret == 1)
        printf("小端模式");
    else
        printf("大端模式");
    
    return 0;
}

总结

到此这篇关于C语言中枚举与联合体使用的文章就介绍到这了,更多相关C语言枚举与联合体用法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_46606290/article/details/120416532