2026-08-19 周三 · 二级指针与内存管理
2026-08-19
技术
C 语言
学习内容:C 语言 Day18 笔记——二级指针与内存管理
二级指针和多级指针
二级指针(double pointer):表示一个指针类型数据的内存地址(指向指针的指针)。三级指针表示二级指针的地址,以此类推,统称多级指针。
short s = 0x1234;
short* p1 = &s; // 一级指针,指向 short
short** p2 = &p1; // 二级指针,指向 short*
short*** p3 = &p2; // 三级指针,指向 short**
short**** p4 = &p3; // 四级指针,指向 short***
**p2 += 5; // 解引用两次回到 s,等价于 s += 5;
--***p3; // 解引用三次回到 s,等价于 --s;
解引用层级:
*p2得到p1(一级指针),**p2才得到最终的s。多级指针就是"指针的指针的指针…",每多一级就多一层间接寻址。
内存管理(Memory Management)
操作系统给每个进程分配一块独立的私有地址空间,又分为几个区域:
| 区域 | 存放内容 |
|---|---|
| 栈区(stack) | 局部变量、函数调用(形参、返回地址) |
| 堆区(heap) | 动态分配的内存(malloc/free) |
| 静态存储区(static) | 全局变量、静态变量 |
| 常量区(constant) | 字符串字面量、常量 |
| 代码区(text) | 程序的机器指令(函数体) |
之前学过的知识点在这里串起来了:局部变量在栈区(函数结束即释放,所以不能返回其指针);字符串字面量在常量区(只读,修改会段错误);函数在代码区(所以有函数指针);
malloc在堆区(手动申请/释放)。
链表练习(test.c)
今日继续练习链表,test.c 里对比了两套实现:
- link.c / link.h:单向链表简洁版,函数名不带前缀——
create/insert_head/insert_tail/show/find/reverse/delete/destroy - list.c / list.h:单向链表 + 循环链表完整版(
link_xxx与clink_xxx两套) - main.c:测试用例(创建 → 尾插 → 头插 → 反转 → 删除 → 查找 → 销毁)
核心操作全部覆盖:头插、尾插、打印、反转、查找、删除、销毁;循环链表版用 head->next == head 判断遍历终点。
Rust
无。
思考
无。
明日计划
- C 语言:结构体(struct)、动态内存分配深入(malloc/free)、字符串库函数
- Rust:恢复学习节奏