C语言学习笔记(十四)——共用体、枚举、位运算与内存管理

发布时间:2026/8/6 4:13:17
C语言学习笔记(十四)——共用体、枚举、位运算与内存管理 一、共用体union1. 什么是共用体共用体union也是一种构造数据类型。与结构体不同结构体中所有成员变量同时存在共用体中的所有成员变量共享同一块内存空间也就是说共用体一次只能保存一个成员变量的数据。2. 共用体定义格式语法union 共用体名称 { 数据类型 成员1; 数据类型 成员2; ... };例如union Data { int a; float b; char c; };定义了一个共用体类型union Data二、共用体变量定义方法一先定义类型再定义变量union Data { int a; float b; char c; }; union Data data;方法二定义时创建变量union Data { int a; float b; char c; }data;三、共用体成员访问使用.访问。例如data.a 10; printf(%d,data.a);示例#includestdio.h union Data { int a; float b; }; int main() { union Data data; data.a10; printf(%d\n,data.a); data.b3.14; printf(%f\n,data.b); return 0; }输出10 3.140000但是data.b3.14;之后data.a的数据会被覆盖。原因两个成员共用同一块内存。四、结构体和共用体区别区别structunion内存每个成员独立空间所有成员共享空间数据保存所有成员同时有效只有一个成员有效大小所有成员大小之和考虑对齐最大成员大小用途保存多个相关数据节省内存例如结构体struct Test { int a; char b; };内存a空间 b空间共用体union Test { int a; char b; };内存a | b共享同一块空间。五、枚举enum1. 什么是枚举枚举是一种构造数据类型。用于表示一组固定的取值。例如星期星期一 星期二 星期三 ...性别男 女状态运行 停止 暂停六、枚举定义格式enum 枚举名称 { 枚举值1, 枚举值2, ... };例如enum Week { MONDAY, TUESDAY, WEDNESDAY };默认情况下第一个枚举值为0例如MONDAY 0 TUESDAY 1 WEDNESDAY 2七、枚举变量使用定义enum Week day;赋值dayMONDAY;示例#includestdio.h enum Week { MONDAY, TUESDAY, WEDNESDAY }; int main() { enum Week day; dayMONDAY; printf(%d\n,day); return 0; }输出0八、枚举的优点相比直接使用数字int status1;无法知道1代表什么使用枚举enum Status { RUN, STOP };代码可读性更高。九、位运算1. 什么是位运算计算机中所有数据最终都是二进制形式存储。例如十进制5二进制0101位运算就是对数据的二进制位进行操作。十、位运算符C语言提供符号名称按位与|按位或^按位异或~按位取反左移右移十一、按位与规则1 1 1 其他 0例如5: 0101 3: 0011 ---- 0001结果1代码int a5; int b3; printf(%d,ab);十二、按位或|规则只要有一个1结果就是1例如0101 0011 | 0111结果7十三、按位异或^规则相同为0 不同为1例如0101 0011 ^ 0110结果6十四、左移和右移左移例如51二进制0101左移1010结果10右移例如81二进制1000右移0100结果4十五、位运算应用1. 判断奇偶整数最低位0 偶数 1 奇数代码if(num 1) { printf(奇数); } else { printf(偶数); }2. 设置某一位例如a | (13);将第3位置1。3. 清除某一位a ~(13);将第3位置0。十六、内存管理1. 为什么需要动态内存之前定义变量int a;属于栈空间特点自动分配自动释放但是有些情况下不知道需要多少空间。例如用户输入学生数量请输入学生人数 100需要动态创建100个学生空间。这时候需要动态内存分配十七、动态内存函数C语言提供头文件#include stdlib.h常用函数函数作用malloc申请空间calloc申请并初始化realloc重新调整空间free释放空间十八、malloc函数格式malloc(空间大小);例如申请10个intint *p; p(int*)malloc(10*sizeof(int));申请成功返回空间首地址失败返回NULL完整代码#includestdio.h #includestdlib.h int main() { int *p; p(int*)malloc(10*sizeof(int)); if(pNULL) { printf(申请失败); return -1; } p[0]100; printf(%d\n,p[0]); free(p); return 0; }十九、free释放内存动态申请的空间不会自动释放。必须free(p);否则会产生内存泄漏二十、calloc函数区别malloc申请空间不初始化。calloc申请空间并初始化为0。格式calloc(数量,大小);例如int *p; p(int*)calloc(10,sizeof(int));二十一、realloc调整空间用于改变已经申请的空间大小。例如prealloc(p,20*sizeof(int));原来10个int调整20个int二十二、动态数组示例#includestdio.h #includestdlib.h int main() { int n; scanf(%d,n); int *arr; arr(int*)malloc(n*sizeof(int)); for(int i0;in;i) { arr[i]i; } for(int i0;in;i) { printf(%d ,arr[i]); } free(arr); return 0; }总结本节学习了 C 语言中的高级数据类型和内存管理共用体 union特点多个成员共享内存节省空间枚举 enum特点表示固定状态提高代码可读性位运算掌握 | ^ ~ 应用标志位控制权限管理底层开发动态内存管理重点malloc() calloc() realloc() free()