Bootstrap

C语言26-共用体和枚举

共用体(联合体)

共用体的语法

共用体union是一个能在同一个存储空间存储不同类型数据的类型

● 共用体所占的内存长度等于其最长成员的长度。 //最长的内存长度是共用体占用的最长的

● 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用 //最后一次输入的数据类型的数据决定了其他数据;

● 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖

● 共用体变量的地址和它的各成员的地址都是同一地址 //在一个地址中

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
​
//定义一个共用体类型
union Test {
    unsigned char a;
    unsigned int b;
    unsigned short c;
};
​
int main() {
    //共用体,又叫联合体  使用关键字union定义
    //1、定义共用体变量
    union Test t;
    //2、共用体所有成员的首地址是一样的
    printf("%p\n%p\n%p\n%p\n", &(t.a), &(t.b), &(t.c),&t);
    //3、共用体的内存大小为最大成员的内存大小
    printf("%lld\n", sizeof(union Test));
    printf("*****************\n");
    //4、共用体一个成员赋值,会影响另外的成员
    t.a = 'h';
    printf("%c\n", t.a);
    t.b = 90;
    printf("%u\n", t.b);
    printf("%c\n", t.a);
    t.c = 12;
    printf("%hu\n", t.c);
    printf("%u\n", t.b);
    printf("%c\n", t.a);
    return 0;
}

共用体的主要用途有:

1 节省内存空间:当多个成员变量不会同时使用,但需要共享同一块内存空间时,可以使用共用体来节省内存。

2 数据类型转换:共用体可以用于不同类型之间的转换,通过存储一个成员变量,然后通过另一个成员变量来读取转换后的值。

共用体的主要特点:

1 共用体的大小取决于最大的成员的大小。

2 共用体的成员 共享同一块内存空间,只能同时存储其中一个成员的值。

3 对共用体的任何成员的修改都会影响到其他成员。

4 共用体的成员可以具有不同的数据类型,但它们在内存中的起始位置是相同的。

共用体和结构体的区别(面试题)

首先定义结构体类型的关键字是struct 而定义共用体类型的关键字是union

●存储方式:

○结构体:结构体中的每个成员都占据独立的内存空间,成员之间按照定义的顺序依次存储

○共用体:共用体中的所有成员共享同一块内存空间,不同成员可以存储在同一个地址上

●内存占用:

○结构体:结构体的内存占用是成员变量占用空间之和,每个成员变量都有自己的内存地址

○共用体:共用体的内存占用是最大成员变量所占用的空间大小,不同成员变量共享同一块内存地址

枚举

枚举介绍:

(1)枚举是C语言中的一种构造数据类型,它可以让数据更简洁,更易读,对于只有几个有限的特定数据,可以使用枚举.

(2)枚举对应英文(enumeration,简写enum)

(3)枚举是一组常量的集合,包含一组有限的特定的数据

(4)枚举语法定义格式为:

enum 枚举名称 { 值1 ,值2,值3 .......}

(5)枚举成员的类型

枚举的成员默认情况下都是整数类型,通常是int类型。这意味着每个枚举成员都会被赋予一个整数值,并且这些整数值从0开始递增。如果没有显式地指定枚举成员的值,那么第一个成员的值为0,第二个成员的值为1,依此类推。同时,可以显式地为枚举成员指定一个整数值,这个值可以是正整数、负整数或零。

枚举的应用

表示状态和标志位

枚举可以用来表示状态和标志位。例如,使用枚举来表示开关的状态,如打开(ON)和关闭(OFF);或者表示系统的状态,如就绪(READY)、等待(WAITING)等;表示选项和模式,可以定义不同的操作模式,如读取模式、写入模式和编辑模式。

//表示开关状态
enum SwitchState {
    OFF,
    ON
};
​
//表示系统状态
enum SystemState {
    READY,
    WAITING,
    ERROR
};
​
​
//表示模式
enum OperationMode {
    READ_MODE,
    WRITE_MODE,
    EDIT_MODE
};
表示星期和月份
//表示星期
enum Weekday {
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
};
//表示月份
enum Month {
    January,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December
};
​
状态机和控制流

枚举常用于状态机的实现,以便在程序中管理不同的状态。这对于处理复杂的控制流非常有用。

enum State {
    IDLE,
    RUNNING,
    ERROR
};
enum State current_state = IDLE;
// 在状态机中根据当前状态执行不同的操作
switch (current_state) {
    case IDLE:
        // 执行空闲状态下的操作
        break;
    case RUNNING:
        // 执行运行状态下的操作
        break;
    case ERROR:
        // 执行错误状态下的操作
        break;
}
;