欢迎光临
我们一直在努力

【C语言小白日记】今天学了共用体、位运算和内存管理,感觉头有点大但又觉得自己行了![特殊字符]

哈喽大家好!我是正在死磕嵌入式的小白,今天依旧是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语言人! 💪

如果觉得这篇笔记对你有帮助,动动小手点个赞吧!咱们下篇见~

赞(0)
未经允许不得转载:171主机测评 » 【C语言小白日记】今天学了共用体、位运算和内存管理,感觉头有点大但又觉得自己行了![特殊字符]
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址