哈喽大家好!我是正在死磕嵌入式的小白,今天依旧是C语言。👋
今天学习的内容有点“硬核”,涉及到了共用体、枚举、位运算还有最让人头秃的内存管理。刚开始听的时候有点晕,但整理完笔记发现其实逻辑挺清晰的。
为了防止自己明天就忘,赶紧把热乎的笔记整理出来,顺便分享给和我一样正在学习C语言的小伙伴们。如果有不对的地方,欢迎大佬们在评论区指正哈!🙏
一、 共用体(Union)—— 抠门的“合租室友” 🏠
首先学的是共用体(也叫联合体)。
我把它理解为几个变量“合租”一间房,但是这个房间太小了,同一时间只能睡一个人。
1. 怎么定义的?
它的定义方式和结构体(struct)特别像,但是关键字是 union。
union 共用体名 {
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
…
};
// 定义变量
union 共用体名 变量名;
2. 和结构体的区别(重点!)
-
结构体:每个成员都有自己的房间,大家互不干扰。
-
共用体:所有成员共用同一块空间。
👉 意味着什么?
你改了成员A的值,成员B的值可能也就变了!因为它们读写的是同一块内存。这块空间的大小取决于最大的那个成员变量。
3. 内存大小端模式
既然共用了内存,就涉及到数据在内存里怎么存的问题,这里有两个概念:
-
小端模式 (Little-Endian):
-
数据的低位,存在内存的低地址。
-
数据的高位,存在内存的高地址。
-
(这是目前最常见的,比如我们的PC大多是小端)
-
-
大端模式 (Big-Endian):
-
数据的高位,存在内存的低地址。
-
数据的低位,存在内存的高地址。
-
二、 枚举(Enum)—— 给数字起个名字 🏷️
枚举其实就是为了让代码更好读。
1. 定义
enum 枚举名 {
MEMBER_1, // 默认是0
MEMBER_2, // 默认是1
MEMBER_3 // 默认是2
};
2. 小笔记
-
枚举常量本质上都是整型。
-
如果没特意赋值,每一个常量的值都是前一个常量的值 + 1。
-
第一个常量默认是 0。
三、 typedef —— 起个外号
笔记里提到了这个,简单复习一下。typedef 就是给已有的数据类型起个“别名”,让类型名写起来更短或者更有意义。
四、 位运算 —— 0和1的魔法 🪄
这部分我觉得特别酷,直接操作二进制位!
1. 常用运算符
| 符号 | 名称 | 描述 |
| & | 按位与 | 全1才1,有0则0(与0得0) |
| | | 按位或 | 有1则1,全0才0(或1置1) |
| ^ | 按位异或 | 相同为0,不同为1 |
| ~ | 按位取反 | 0变1,1变0 |
| << | 左移 | 丢弃高位,低位补0 |
| >> | 右移 | 丢弃低位,高位补符号位(通常) |
2. 两个超级实用的技巧(背下来!)
场景A:不改变其他位,把第 n 位置 1
口诀:或 1 置 1
num |= (1 << n);
场景B:不改变其他位,把第 n 位置 0
口诀:与 0 得 0
num = num & ~(1 << n);
3. 异或实现两个数交换
这个面试好像很爱问!不需要中间变量就能交换两个数,原理利用了异或的性质 A ^ A = 0 和 A ^ 0 = A。
int num1 = 100;
int num2 = 200;
num1 = num1 ^ num2; // 第一步
num2 = num1 ^ num2; // 第二步:其实是 (num1^num2) ^ num2 -> num1 ^ 0 -> num1
num1 = num1 ^ num2; // 第三步:其实是 (num1^num2) ^ num1 -> num2 ^ 0 -> num2
// 此时 num1 和 num2 已经交换了
五、 内存管理 —— 自己的地盘自己做主 🧠
这部分最容易出Bug(比如内存泄漏),要特别小心。
1. 栈区 (Stack) vs 堆区 (Heap)
| 特性 | 栈区 (Stack) | 堆区 (Heap) |
| 管理者 | 操作系统自动管理 | 程序员手动管理 (malloc/free) |
| 用途 | 存局部变量、函数参数 | 存大数据的空间 |
| 生命周期 | 出了作用域自动回收 | 必须手动 free,否则内存泄漏 |
| 特点 | 空间较小,速度快 | 空间大,相对灵活 |
| 增长方向 | 自高向低增长 | 自低向高增长 |
2. 重要函数接口
申请空间:malloc
void *malloc(size_t size);
-
功能:在堆区申请 size 个字节的空间。
-
返回值:
-
成功:返回申请到的空间首地址。
-
失败:返回 NULL(所以用完一定要判断是不是NULL!)。
-
释放空间:free
void free(void *ptr);
-
功能:把申请的空间还给系统。
-
参数:malloc 返回的那个首地址。
结尾
今天的笔记就整理到这里啦!虽然共用体和位运算平时写业务代码可能用得少一点,但是看底层源码或者做嵌入式开发好像很重要。至于内存管理,malloc和free一定得成对出现,不然程序跑着跑着就崩了😂。
加油,C语言人! 💪
如果觉得这篇笔记对你有帮助,动动小手点个赞吧!咱们下篇见~




