共用体(联合体)
共用体的语法
共用体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; }