2026/8/2 6:16:58

第10天:指针 — 操作指南 ★★★ 全12天最重要的一天

第10天:指针 — 操作指南 ★★★ 全12天最重要的一天 小白记录日常学习一、今日任务总览| 步骤 | 内容 | 时间 ||------|------|------|| ① | 阅读教材第10章 §10.4-10.7 | 80分钟 || ② | 用纸笔画内存图来理解指针 | 30分钟 || ③ | 手打并运行3个练习 | 60分钟 || ④ | 反复体会练习2swap的成功 | 30分钟 |二、今日核心知识点2.1 指针是什么 —— 用生活类比想象一座公寓楼普通变量 a 42 指针变量 p a房间号101号 房间号305号房间里放着42 房间里放着一张纸条写101号指向101号房间你去101号 → 看到42 你去305号 → 看到纸条101号按纸条去找101号 → 看到42cint a 42; // a 是普通变量存的是 42int *p a; // p 是指针变量存的是 a 的地址门牌号a → 42 // 直接取值*p → 42 // 间接取值先去p拿地址再去那个地址拿值a → a 的地址 // 取地址2.2 和 * —— 两个核心运算符| 符号 | 名字 | 作用 | 例子 ||------|------|------|------|| | 取地址 | 问你住哪 | p a; → p 知道 a 住哪 || * | 解引用 | 去这个地址看看 | *p 100; → 去 p 存的地址把值改成 100 |cint a 10;int *p a; // p 存了 a 的地址*p 20; // 通过地址修改 a → a 变成 20printf(%d, a); // 输出 20**两个用 * 的场景不要搞混**cint *p a; // 这里的 * 是声明p 是指针类型*p 20; // 这里的 * 是解引用去 p 存的地址那里2.3 指针实现真正的 swap ★ 今天的顿悟时刻第8天的失败cvoid swap(int x, int y) // x 和 y 是副本{int temp x; // 交换副本x y;y temp;} // 函数结束副本销毁原件没动今天的成功cvoid swap(int *x, int *y) // x 和 y 存的是地址门牌号{int temp *x; // 去 x 指向的房间取出值*x *y; // 去 y 的房间把值搬到 x 的房间*y temp;}// 调用swap(a, b); ← 传的是地址一句话总结 值传递 把文件复印一份给你你在复印件上改 指针 把文件柜的钥匙给你你开柜子改原件2.4 指针与数组cint arr[5] {10, 20, 30, 40, 50};// 下面三种方式完全等价arr[2] // 下标访问 → 30*(arr 2) // 指针偏移 → 30*(arr[0] 2) // 从首地址偏移 → 30// 数组名 arr 就是 arr[0]是首元素的地址2.5 指针算术cint *p arr;p 1 → 下一个 int 的位置实际地址 4 字节因为 int 占 4 字节p → p 指向下一个元素p n → p 指向后面第 n 个元素三、阅读任务80分钟《C Primer Plus 第6版》第10章| 章节 | 内容 | 重点 ||------|------|------|| §10.4 | 指针简介 | ★★★ || §10.5 | 指针运算符 和 * | ★★★ || §10.6 | 指针与数组 | ★★★ || §10.7 | 指针运算 | ★★★ |阅读方法放慢速度。每看到一个指针例子先在纸上画出内存图再往下看。指针不是看懂的是画懂的。四、动手练习60分钟练习1指针基本操作bashgcc ex1_pointer_basics.c -o ex1_pointer_basics.exe./ex1_pointer_basics.exe必做在纸上画出变量 a 和指针 p 的内存关系图。标注地址、值、箭头指向关系。这张图要自己画不要只看代码。练习2真正的 swap ★★★bashgcc ex2_swap_real.c -o ex2_swap_real.exe./ex2_swap_real.exe这是今天最重要的练习。运行完后1. 找出第8天 day08/ex3_swap_fail.c再跑一遍2. 对比两个程序的输出3. 在纸上画出两个 swap 版本的内存图感受传值和传地址的本质区别如果只做一个练习就做这个。搞懂了今天的 swap指针就入门了。练习3指针数组遍历bashgcc ex3_pointer_array.c -o ex3_pointer_array.exe./ex3_pointer_array.exe比较三种遍历方式注意观察 p1 的地址比 p 多了多少应该刚好是一个 int 的字节数。五、自由实验30分钟实验1用指针实现 strlen不调用 string.h用指针实现计算字符串长度cint my_strlen(const char *str){const char *p str;while (*p ! \0)p;return p - str; // 指针相减 元素个数}实验2用指针实现选择排序把第9天的选择排序改成指针版本用指针而非下标遍历。六、今日自检- [ ] 能说清楚 int *p a; 中 int*、p、a 分别是什么- [ ] 能说清楚 *p 是什么解引用顺着地址访问值- [ ] 能解释第8天的 swap 为什么失败今天的 swap 为什么成功- [ ] 知道 arr[i] 和 *(arri) 是等价的- [ ] 知道 p1 跳过几个地址取决于指针的类型- [ ] 三个练习全部运行成功七、明天预告第11天字符串 — 本质上就是字符指针学完指针再看字符串会豁然开朗。