联合和枚举
924 字
5 分钟
联合和枚举
联合体(共用体)
联合体类型的声明
- 联合体由一个或多个成员构成,成员可以是不同类型
- 编译器只为最大的成员分配足够的内存空间
- 所有成员共用同一块内存空间
- 给其中一个成员赋值,其他成员的值也会变化
#include <stdio.h>
// 联合类型的声明union Un{ char c; int i;};
int main(){ // 联合变量的定义 union Un un = {0}; // 计算变量的大小 printf("%d\n", sizeof(un)); // 输出:4 return 0;}特点
- 成员共用同一块内存空间
- 联合变量的大小至少是最大成员大小
地址验证
#include <stdio.h>
union Un{ char c; int i;};
int main(){ union Un un = {0}; printf("%p\n", &(un.i)); // 三个地址相同 printf("%p\n", &(un.c)); printf("%p\n", &un); return 0;}内存共享验证
#include <stdio.h>
union Un{ char c; int i;};
int main(){ union Un un = {0}; un.i = 0x11223344; un.c = 0x55; printf("%x\n", un.i); // 输出:11223355 return 0;}相同成员的结构体和联合体对比
- 结构体
struct S{ char c; int i;};struct S s = {0};-
各成员有独立的内存空间
-
存在内存对齐,可能有浪费的空间
-
联合体
union Un{ char c; int i;};union Un un = {0};联合体大小的计算规则
- 联合的大小至少是最大成员的大小
- 当最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
#include <stdio.h>
union Un1{ char c[5]; // 大小5,对齐数1 int i; // 大小4,对齐数4};
union Un2{ short c[7]; // 大小14,对齐数2 int i; // 大小4,对齐数4};
int main(){ printf("%d\n", sizeof(union Un1)); // 输出:8(对齐到4的倍数) printf("%d\n", sizeof(union Un2)); // 输出:16(对齐到4的倍数) return 0;}联合体应用示例
struct gift_list{ int stock_number; // 库存量 double price; // 定价 int item_type; // 商品类型
union { struct { char title[20]; // 书名 char author[20]; // 作者 int num_pages; // 页数 } book; struct { char design[30]; // 设计 } mug; struct { char design[30]; // 设计 int colors; // 颜色 int sizes; // 尺寸 } shirt; } item;};联合体判断大小端
int check_sys(){ union { int i; char c; } un; un.i = 1; return un.c; // 返回1是小端,返回0是大端}枚举类型
声明
- 枚举就是把可能的取值一一列举
enum Day // 星期{ Mon, // 默认值:0 Tues, // 默认值:1 Wed, // 默认值:2 Thur, // 默认值:3 Fri, // 默认值:4 Sat, // 默认值:5 Sun // 默认值:6};
enum Sex // 性别{ MALE, // 默认值:0 FEMALE, // 默认值:1 SECRET // 默认值:2};
enum Color // 颜色{ RED, // 默认值:0 GREEN, // 默认值:1 BLUE // 默认值:2};
// 可以自定义初始值enum Color{ RED = 2, GREEN = 4, BLUE = 8};枚举类型的优点
- 增加代码的可读性和可维护性
- 类型检查更严谨(相比#define)
- 便于调试(预处理阶段不会删除枚举符号)
- 使用方便,一次可以定义多个常量
- 遵循作用域规则
枚举类型使用
enum Color{ RED = 1, GREEN = 2, BLUE = 4};
enum Color clr = GREEN; // 正确:使用枚举常量赋值// clr = 2; // C语言中可以,C++中不行(类型检查严格)总结
联合体要点
- 所有成员共享同一内存空间
- 大小由最大成员和对齐规则决定
- 适合需要节省内存的场景
枚举要点
- 提高代码可读性和类型安全性
- 默认从0开始递增,可自定义初始值
- 相比#define有更好的调试支持和作用域控制
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
类和对象
C/C++class 是定义类的关键字 类体中内容称为类的成员: 类中的变量 → 类的属性或成员变量 类中的函数 → 类的方法或成员函数 成员变量命名惯例:前面或后面加 或 m 开头(非强制) C++ 中 struct 也可以定义类,但推荐使用 c…
2
红黑树封装实现mymap和myset
C/C++rbtree的泛型设计:通过第二个模板参数Value决定红黑树节点中存储的数据类型 set实例化rbtree时:Value = Key map实例化rbtree时:Value = pair
3
哈希表封装myunordered_map和myunordered_set
C/C++SGI-STL30版本没有unorderedmap和unorderedset,但实现了hashmap和hashset作为非标准容器。其核心框架如下:
4
多态
C/C++多态(polymorphism):即"多种形态",指同一接口表现出不同行为的能力。
5
结构体
C/C++结构体:一些值的集合,这些值称为成员变量 每个成员可以是不同类型变量
随机文章随机推荐

