C语言联合体&枚举

📅 发布时间:2026/7/13 1:46:19 👁️ 浏览次数:
C语言联合体&枚举
联合体共用体联合体类型的声明联合体由一个或多个成员构成成员可以是不同类型编译器只为最大的成员分配足够的内存空间所有成员共用同一块内存空间给其中一个成员赋值其他成员的值也会变化#includestdio.h// 联合类型的声明unionUn{charc;inti;};intmain(){// 联合变量的定义unionUn un{0};// 计算变量的大小printf(%d\n,sizeof(un));// 输出4return0;}特点成员共用同一块内存空间联合变量的大小至少是最大成员大小地址验证#includestdio.hunionUn{charc;inti;};intmain(){unionUn un{0};printf(%p\n,(un.i));// 三个地址相同printf(%p\n,(un.c));printf(%p\n,un);return0;}内存共享验证#includestdio.hunionUn{charc;inti;};intmain(){unionUn un{0};un.i0x11223344;un.c0x55;printf(%x\n,un.i);// 输出11223355return0;}相同成员的结构体和联合体对比结构体structS{charc;inti;};structSs{0};各成员有独立的内存空间存在内存对齐可能有浪费的空间联合体unionUn{charc;inti;};unionUn un{0};联合体大小的计算规则联合的大小至少是最大成员的大小当最大成员大小不是最大对齐数的整数倍时要对齐到最大对齐数的整数倍#includestdio.hunionUn1{charc[5];// 大小5对齐数1inti;// 大小4对齐数4};unionUn2{shortc[7];// 大小14对齐数2inti;// 大小4对齐数4};intmain(){printf(%d\n,sizeof(unionUn1));// 输出8对齐到4的倍数printf(%d\n,sizeof(unionUn2));// 输出16对齐到4的倍数return0;}联合体应用示例structgift_list{intstock_number;// 库存量doubleprice;// 定价intitem_type;// 商品类型union{struct{chartitle[20];// 书名charauthor[20];// 作者intnum_pages;// 页数}book;struct{chardesign[30];// 设计}mug;struct{chardesign[30];// 设计intcolors;// 颜色intsizes;// 尺寸}shirt;}item;};联合体判断大小端intcheck_sys(){union{inti;charc;}un;un.i1;returnun.c;// 返回1是小端返回0是大端}枚举类型声明枚举就是把可能的取值一一列举enumDay// 星期{Mon,// 默认值0Tues,// 默认值1Wed,// 默认值2Thur,// 默认值3Fri,// 默认值4Sat,// 默认值5Sun// 默认值6};enumSex// 性别{MALE,// 默认值0FEMALE,// 默认值1SECRET// 默认值2};enumColor// 颜色{RED,// 默认值0GREEN,// 默认值1BLUE// 默认值2};// 可以自定义初始值enumColor{RED2,GREEN4,BLUE8};枚举类型的优点增加代码的可读性和可维护性类型检查更严谨相比#define便于调试预处理阶段不会删除枚举符号使用方便一次可以定义多个常量遵循作用域规则枚举类型使用enumColor{RED1,GREEN2,BLUE4};enumColorclrGREEN;// 正确使用枚举常量赋值// clr 2; // C语言中可以C中不行类型检查严格总结联合体要点所有成员共享同一内存空间大小由最大成员和对齐规则决定适合需要节省内存的场景枚举要点提高代码可读性和类型安全性默认从0开始递增可自定义初始值相比#define有更好的调试支持和作用域控制