C语言学习--共用体

📅 2026/8/27 10:07:55
C语言学习--共用体
什么是共用体有时需要一种数据结构不同的场合表示不同的数据类型。比如如果只用一种数据结构表示学生的“成绩”这种结构就需要有时是整数80、90有时是字符A、B有时是浮点数80.5、60.5。C语言提供了共用体类型Union 结构用来自定义可以灵活变更的数据结构。它内部可以包含各种属性但同一时间只能有一个属性因为所有属性都保存在同一个内存地址后面写入的属性会覆盖前面的属性。这样做的最大好处是节省空间。“共用体”与“结构体”的定义形式相似但它们的含义是不同的。结构体变量所占内存长度可以认为是各成员占的内存长度的叠加每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度几个成员共用一个内存区。定义共用体类型union 类型名称{成员类型 成员名称;成员类型 成员名称;成员类型 成员名称;成员类型 成员名称;成员类型 成员名称;....}注意类型名称和成员名称都需要符合标识符规范共用体体的成员类型可以是任意类型整数、浮点、数组、指针、枚举、结构体共同体变量初始化赋值// 先声明共同体变量再给其中一个成员赋值 union Score sc1; sc1.a A; // 同时定义共用体变量并初始化赋值给第一个成员赋值 union Score sc2 {C}; // 同时定义共用体变量并初始化赋值给指定成员赋值 union Score sc3 {.b 100};④ 共同体变量访问共同体成员使用 .⑤ 共用体指针访问共同体成员使用 -⑥ 共用体变量存储大小内存是最大成员的大小 所用成员共同的同一个内容空间一个时刻只有一个成员是有效的共用体赋值特点、赋值特点共用体所有成员共享同一块内存空间同一时刻只能有一个成员有效后赋值的成员会覆盖之前的值示例中先赋值sc1.aB再赋值sc1.b100最后赋值sc1.c98.13最终只有c的值有效内存覆盖机制当给sc1.b赋值99时仅修改最后4个字节不影响高位的浮点数存储浮点数的符号位和指数位未被修改因此sc1.c仍显示98.13typedef#define 类型别名与 typedef 类型别名的区别① 执行时机不同#define在预处理阶段执行typedef在程序运行阶段执行。② 类型检查#define只进行简单文本替换不作类型检查typedef在编译阶段会进行类型检查。③ 作用域#define设置的别名无作用域的概念typedef设置的别名具有作用域。① 基本类型别名typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64;② 数组别名typedef int Int_array[]; typedef double Double_array5[5];③ 函数别名typedef double Avg_function(int, int);④ 指针别名// 给指向基本类型数据的指针起别名 typedef int *Int_ptr; typedef char *String; // 数组指针起别名 typedef int (*Int_arr_ptr)[]; // 函数指针起别名 typedef double (*Avg_function_ptr)(int, int);⑤ 结构体别名// 5.1 先定义结构体类型再取别名 struct User { char *name; int age; }; typedef struct User VipUser; // 5.2 同时定义结构体类型并取别名 typedef struct Person { char *name; int age; } Person; // 5.3 同时定义结构体类型并取别名且省略结构体类型名(强烈推荐) typedef struct { char *name; double score; } Student;⑥ 共用体别名// 6.1 先定义共用体类型再取别名 // 6.2 同时定义共用体类型和别名 // 6.3 同时定义共用体类型和别名省略共用体类型名(强烈推荐) typedef union { char a; double b; } Score;⑦ 枚举别名// 7.1 先定义枚举类型再取别名 // 7.2 同时定义枚举类型和别名 // 7.3 同时定义枚举类型和别名省略共用体类型名(强烈推荐) typedef enum { MALE, FEMALE, ELSE } Gender;