/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
文章目录
-
- 📋 本周学习地图
- 1️⃣ 内存模型:先搞懂变量"住在哪"
-
- 1.1 变量 = 内存地址 + 值
- 1.2 四个内存区域(了解)
- 2️⃣ 指针基础:声明、取址、解引用
-
- 2.1 三个基本操作
- 2.2 指针的声明陷阱
- 2.3 空指针:`nullptr`(C++11)
- 2.4 空指针解引用 = 崩溃
- 3️⃣ 指针与数组:数组名就是首地址
-
- 3.1 数组名退化为指针
- 3.2 两个 sizeof 陷阱
- 4️⃣ 指针算术:只能同类型指针相减
-
- 4.1 合法运算
- 4.2 非法运算
- 5️⃣ const 与指针:三种组合必须分清
-
- 5.1 三种组合对照表
- 5.2 从右往左读法
- 6️⃣ 引用:必须绑定、不能改绑、不能为空
-
- 6.1 引用的三条铁律
- 6.2 引用就是"别名"
- 6.3 引用作为函数参数(零拷贝 + 可改)
- 6.4 const 引用:零拷贝 + 只读(大对象首选)
- 7️⃣ 指针 vs 引用:一张表说清
- 8️⃣ 危险区:野指针、悬空指针、悬空引用
-
- 8.1 三种"坏指针/引用"
- 8.2 野指针
- 8.3 悬空指针(第 6 周详讲,先认识)
- 8.4 悬空引用(本周重点)
- 9️⃣ 本周高频面试题(5 道)
- 🔟 本周项目验收:手写一个动态数组(简化版)
- 1️⃣1️⃣ 本周避坑速查表(贴墙版)
📚 本文是「C++ 全栈开发 30 周课程」阶段二第 5 周的详细讲义。阶段二正式进入 C++ 的灵魂——内存。本周目标:彻底搞懂指针和引用这两个"间接访问"工具,理解内存地址、const 与指针的组合、以及野指针/悬空引用的成因与防范。
📋 本周学习地图
#mermaid-svg-qqxPr2JDb5p4Z3uX{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qqxPr2JDb5p4Z3uX .error-icon{fill:#552222;}#mermaid-svg-qqxPr2JDb5p4Z3uX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qqxPr2JDb5p4Z3uX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .marker.cross{stroke:#333333;}#mermaid-svg-qqxPr2JDb5p4Z3uX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qqxPr2JDb5p4Z3uX p{margin:0;}#mermaid-svg-qqxPr2JDb5p4Z3uX .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .cluster-label text{fill:#333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .cluster-label span{color:#333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .cluster-label span p{background-color:transparent;}#mermaid-svg-qqxPr2JDb5p4Z3uX .label text,#mermaid-svg-qqxPr2JDb5p4Z3uX span{fill:#333;color:#333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .node rect,#mermaid-svg-qqxPr2JDb5p4Z3uX .node circle,#mermaid-svg-qqxPr2JDb5p4Z3uX .node ellipse,#mermaid-svg-qqxPr2JDb5p4Z3uX .node polygon,#mermaid-svg-qqxPr2JDb5p4Z3uX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qqxPr2JDb5p4Z3uX .rough-node .label text,#mermaid-svg-qqxPr2JDb5p4Z3uX .node .label text,#mermaid-svg-qqxPr2JDb5p4Z3uX .image-shape .label,#mermaid-svg-qqxPr2JDb5p4Z3uX .icon-shape .label{text-anchor:middle;}#mermaid-svg-qqxPr2JDb5p4Z3uX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qqxPr2JDb5p4Z3uX .rough-node .label,#mermaid-svg-qqxPr2JDb5p4Z3uX .node .label,#mermaid-svg-qqxPr2JDb5p4Z3uX .image-shape .label,#mermaid-svg-qqxPr2JDb5p4Z3uX .icon-shape .label{text-align:center;}#mermaid-svg-qqxPr2JDb5p4Z3uX .node.clickable{cursor:pointer;}#mermaid-svg-qqxPr2JDb5p4Z3uX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .arrowheadPath{fill:#333333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qqxPr2JDb5p4Z3uX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qqxPr2JDb5p4Z3uX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qqxPr2JDb5p4Z3uX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qqxPr2JDb5p4Z3uX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qqxPr2JDb5p4Z3uX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qqxPr2JDb5p4Z3uX .cluster text{fill:#333;}#mermaid-svg-qqxPr2JDb5p4Z3uX .cluster span{color:#333;}#mermaid-svg-qqxPr2JDb5p4Z3uX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qqxPr2JDb5p4Z3uX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qqxPr2JDb5p4Z3uX rect.text{fill:none;stroke-width:0;}#mermaid-svg-qqxPr2JDb5p4Z3uX .icon-shape,#mermaid-svg-qqxPr2JDb5p4Z3uX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qqxPr2JDb5p4Z3uX .icon-shape p,#mermaid-svg-qqxPr2JDb5p4Z3uX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qqxPr2JDb5p4Z3uX .icon-shape .label rect,#mermaid-svg-qqxPr2JDb5p4Z3uX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qqxPr2JDb5p4Z3uX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qqxPr2JDb5p4Z3uX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qqxPr2JDb5p4Z3uX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
第5周 · 指针与引用
1. 内存模型:变量住在哪
2. 指针基础:声明/取址/解引用
3. 指针与数组
4. 指针算术
5. const 与指针的三种组合
6. 引用:必须绑定、不能改绑
7. 指针 vs 引用:一张表说清
8. 危险区:野指针 / 悬空指针 / 悬空引用
避坑:地址与值混淆
避坑:未初始化 / nullptr 解引用
避坑:数组名退化 / sizeof 陷阱
避坑:越界 / 指针相减类型
避坑:const int* 与 int* const 混淆
避坑:返回局部变量引用
选型:什么场景用哪个
本周项目:手写动态数组
1️⃣ 内存模型:先搞懂变量"住在哪"
1.1 变量 = 内存地址 + 值
#include <iostream>
int main() {
int a = 42;
std::cout << "a 的值 = " << a << "\\n"; // 42
std::cout << "a 的地址 = " << &a << "\\n"; // 0x7ffd…(每次运行不同)
}
#mermaid-svg-WhALFJj14yjcYgBK{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WhALFJj14yjcYgBK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WhALFJj14yjcYgBK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WhALFJj14yjcYgBK .error-icon{fill:#552222;}#mermaid-svg-WhALFJj14yjcYgBK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WhALFJj14yjcYgBK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WhALFJj14yjcYgBK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WhALFJj14yjcYgBK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WhALFJj14yjcYgBK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WhALFJj14yjcYgBK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WhALFJj14yjcYgBK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WhALFJj14yjcYgBK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WhALFJj14yjcYgBK .marker.cross{stroke:#333333;}#mermaid-svg-WhALFJj14yjcYgBK svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WhALFJj14yjcYgBK p{margin:0;}#mermaid-svg-WhALFJj14yjcYgBK .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-WhALFJj14yjcYgBK .cluster-label text{fill:#333;}#mermaid-svg-WhALFJj14yjcYgBK .cluster-label span{color:#333;}#mermaid-svg-WhALFJj14yjcYgBK .cluster-label span p{background-color:transparent;}#mermaid-svg-WhALFJj14yjcYgBK .label text,#mermaid-svg-WhALFJj14yjcYgBK span{fill:#333;color:#333;}#mermaid-svg-WhALFJj14yjcYgBK .node rect,#mermaid-svg-WhALFJj14yjcYgBK .node circle,#mermaid-svg-WhALFJj14yjcYgBK .node ellipse,#mermaid-svg-WhALFJj14yjcYgBK .node polygon,#mermaid-svg-WhALFJj14yjcYgBK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WhALFJj14yjcYgBK .rough-node .label text,#mermaid-svg-WhALFJj14yjcYgBK .node .label text,#mermaid-svg-WhALFJj14yjcYgBK .image-shape .label,#mermaid-svg-WhALFJj14yjcYgBK .icon-shape .label{text-anchor:middle;}#mermaid-svg-WhALFJj14yjcYgBK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WhALFJj14yjcYgBK .rough-node .label,#mermaid-svg-WhALFJj14yjcYgBK .node .label,#mermaid-svg-WhALFJj14yjcYgBK .image-shape .label,#mermaid-svg-WhALFJj14yjcYgBK .icon-shape .label{text-align:center;}#mermaid-svg-WhALFJj14yjcYgBK .node.clickable{cursor:pointer;}#mermaid-svg-WhALFJj14yjcYgBK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WhALFJj14yjcYgBK .arrowheadPath{fill:#333333;}#mermaid-svg-WhALFJj14yjcYgBK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WhALFJj14yjcYgBK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WhALFJj14yjcYgBK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WhALFJj14yjcYgBK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WhALFJj14yjcYgBK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WhALFJj14yjcYgBK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WhALFJj14yjcYgBK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WhALFJj14yjcYgBK .cluster text{fill:#333;}#mermaid-svg-WhALFJj14yjcYgBK .cluster span{color:#333;}#mermaid-svg-WhALFJj14yjcYgBK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WhALFJj14yjcYgBK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WhALFJj14yjcYgBK rect.text{fill:none;stroke-width:0;}#mermaid-svg-WhALFJj14yjcYgBK .icon-shape,#mermaid-svg-WhALFJj14yjcYgBK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WhALFJj14yjcYgBK .icon-shape p,#mermaid-svg-WhALFJj14yjcYgBK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WhALFJj14yjcYgBK .icon-shape .label rect,#mermaid-svg-WhALFJj14yjcYgBK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WhALFJj14yjcYgBK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WhALFJj14yjcYgBK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WhALFJj14yjcYgBK :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
内存
&a 取到
直接读
地址 0x7ffd1234
值 42
变量 a
| 值 | a | 变量里存的数据 |
| 地址 | &a | 变量在内存中的位置 |
| 指针 | int* p = &a | 存地址的变量 |
💡 核心认知:指针本身也是一个变量,只不过它存的不是 42,而是 0x7ffd1234 这种地址。
1.2 四个内存区域(了解)
| 栈(stack) | 局部变量、函数参数 | 函数结束自动释放 |
| 堆(heap) | new 出来的对象 | 手动 delete 或智能指针释放 |
| 全局/静态区 | 全局变量、static 变量 | 程序运行全程 |
| 常量区 | 字符串字面量、const 常量 | 程序运行全程 |
本周只涉及栈上的变量和它们的地址;堆在第 6 周「动态内存管理」展开。
2️⃣ 指针基础:声明、取址、解引用
2.1 三个基本操作
#include <iostream>
int main() {
int a = 42;
int* p = &a; // ① 声明指针并取址(p 指向 a)
std::cout << p << "\\n"; // ② 打印指针本身:a 的地址
std::cout << *p << "\\n"; // ③ 解引用:读 p 指向的值 → 42
*p = 100; // ④ 通过指针改 a
std::cout << a << "\\n"; // 100
}
#mermaid-svg-MxtI9Yez5AOd9ZVv{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MxtI9Yez5AOd9ZVv .error-icon{fill:#552222;}#mermaid-svg-MxtI9Yez5AOd9ZVv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MxtI9Yez5AOd9ZVv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .marker.cross{stroke:#333333;}#mermaid-svg-MxtI9Yez5AOd9ZVv svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MxtI9Yez5AOd9ZVv p{margin:0;}#mermaid-svg-MxtI9Yez5AOd9ZVv .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .cluster-label text{fill:#333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .cluster-label span{color:#333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .cluster-label span p{background-color:transparent;}#mermaid-svg-MxtI9Yez5AOd9ZVv .label text,#mermaid-svg-MxtI9Yez5AOd9ZVv span{fill:#333;color:#333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .node rect,#mermaid-svg-MxtI9Yez5AOd9ZVv .node circle,#mermaid-svg-MxtI9Yez5AOd9ZVv .node ellipse,#mermaid-svg-MxtI9Yez5AOd9ZVv .node polygon,#mermaid-svg-MxtI9Yez5AOd9ZVv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MxtI9Yez5AOd9ZVv .rough-node .label text,#mermaid-svg-MxtI9Yez5AOd9ZVv .node .label text,#mermaid-svg-MxtI9Yez5AOd9ZVv .image-shape .label,#mermaid-svg-MxtI9Yez5AOd9ZVv .icon-shape .label{text-anchor:middle;}#mermaid-svg-MxtI9Yez5AOd9ZVv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MxtI9Yez5AOd9ZVv .rough-node .label,#mermaid-svg-MxtI9Yez5AOd9ZVv .node .label,#mermaid-svg-MxtI9Yez5AOd9ZVv .image-shape .label,#mermaid-svg-MxtI9Yez5AOd9ZVv .icon-shape .label{text-align:center;}#mermaid-svg-MxtI9Yez5AOd9ZVv .node.clickable{cursor:pointer;}#mermaid-svg-MxtI9Yez5AOd9ZVv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .arrowheadPath{fill:#333333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MxtI9Yez5AOd9ZVv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MxtI9Yez5AOd9ZVv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MxtI9Yez5AOd9ZVv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MxtI9Yez5AOd9ZVv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MxtI9Yez5AOd9ZVv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MxtI9Yez5AOd9ZVv .cluster text{fill:#333;}#mermaid-svg-MxtI9Yez5AOd9ZVv .cluster span{color:#333;}#mermaid-svg-MxtI9Yez5AOd9ZVv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MxtI9Yez5AOd9ZVv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MxtI9Yez5AOd9ZVv rect.text{fill:none;stroke-width:0;}#mermaid-svg-MxtI9Yez5AOd9ZVv .icon-shape,#mermaid-svg-MxtI9Yez5AOd9ZVv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MxtI9Yez5AOd9ZVv .icon-shape p,#mermaid-svg-MxtI9Yez5AOd9ZVv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MxtI9Yez5AOd9ZVv .icon-shape .label rect,#mermaid-svg-MxtI9Yez5AOd9ZVv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MxtI9Yez5AOd9ZVv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MxtI9Yez5AOd9ZVv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MxtI9Yez5AOd9ZVv :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
*p 解引用
*p = 100 写入
p地址 0x200值 0x100
a地址 0x100值 42
a 改后值 100
| 取地址 | &a | 得到 a 的地址 |
| 声明指针 | int* p | p 是"指向 int 的指针" |
| 赋值指针 | p = &a | p 指向 a |
| 解引用读 | *p | 读 a 的值 |
| 解引用写 | *p = 100 | 改 a 的值 |
2.2 指针的声明陷阱
int* p1, p2; // ⚠️ p1 是 int*,p2 是 int!星号只跟着 p1
int *p3, *p4; // ✅ p3、p4 都是 int*
int* p5, * p6; // ✅ p5、p6 都是 int*
// 建议:一行只声明一个指针
int* p7;
int* p8;
2.3 空指针:nullptr(C++11)
int* p1 = nullptr; // ✅ 现代写法
int* p2 = NULL; // ⚠️ 老写法,NULL 本质是 0,可能引发重载歧义
int* p3 = 0; // ⚠️ 更老的写法,不推荐
// 使用前必须判空
if (p1 != nullptr) {
std::cout << *p1; // 安全
}
💡 规则:指针定义时就初始化,不知道指向哪就写 = nullptr,使用前必须判空。
2.4 空指针解引用 = 崩溃
int* p = nullptr;
// std::cout << *p; // 💥 段错误(Segmentation Fault)
#mermaid-svg-lyZaWABmolygbysg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lyZaWABmolygbysg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lyZaWABmolygbysg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lyZaWABmolygbysg .error-icon{fill:#552222;}#mermaid-svg-lyZaWABmolygbysg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lyZaWABmolygbysg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lyZaWABmolygbysg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lyZaWABmolygbysg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lyZaWABmolygbysg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lyZaWABmolygbysg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lyZaWABmolygbysg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lyZaWABmolygbysg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lyZaWABmolygbysg .marker.cross{stroke:#333333;}#mermaid-svg-lyZaWABmolygbysg svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lyZaWABmolygbysg p{margin:0;}#mermaid-svg-lyZaWABmolygbysg .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-lyZaWABmolygbysg .cluster-label text{fill:#333;}#mermaid-svg-lyZaWABmolygbysg .cluster-label span{color:#333;}#mermaid-svg-lyZaWABmolygbysg .cluster-label span p{background-color:transparent;}#mermaid-svg-lyZaWABmolygbysg .label text,#mermaid-svg-lyZaWABmolygbysg span{fill:#333;color:#333;}#mermaid-svg-lyZaWABmolygbysg .node rect,#mermaid-svg-lyZaWABmolygbysg .node circle,#mermaid-svg-lyZaWABmolygbysg .node ellipse,#mermaid-svg-lyZaWABmolygbysg .node polygon,#mermaid-svg-lyZaWABmolygbysg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lyZaWABmolygbysg .rough-node .label text,#mermaid-svg-lyZaWABmolygbysg .node .label text,#mermaid-svg-lyZaWABmolygbysg .image-shape .label,#mermaid-svg-lyZaWABmolygbysg .icon-shape .label{text-anchor:middle;}#mermaid-svg-lyZaWABmolygbysg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lyZaWABmolygbysg .rough-node .label,#mermaid-svg-lyZaWABmolygbysg .node .label,#mermaid-svg-lyZaWABmolygbysg .image-shape .label,#mermaid-svg-lyZaWABmolygbysg .icon-shape .label{text-align:center;}#mermaid-svg-lyZaWABmolygbysg .node.clickable{cursor:pointer;}#mermaid-svg-lyZaWABmolygbysg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lyZaWABmolygbysg .arrowheadPath{fill:#333333;}#mermaid-svg-lyZaWABmolygbysg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lyZaWABmolygbysg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lyZaWABmolygbysg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lyZaWABmolygbysg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lyZaWABmolygbysg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lyZaWABmolygbysg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lyZaWABmolygbysg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lyZaWABmolygbysg .cluster text{fill:#333;}#mermaid-svg-lyZaWABmolygbysg .cluster span{color:#333;}#mermaid-svg-lyZaWABmolygbysg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lyZaWABmolygbysg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lyZaWABmolygbysg rect.text{fill:none;stroke-width:0;}#mermaid-svg-lyZaWABmolygbysg .icon-shape,#mermaid-svg-lyZaWABmolygbysg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lyZaWABmolygbysg .icon-shape p,#mermaid-svg-lyZaWABmolygbysg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lyZaWABmolygbysg .icon-shape .label rect,#mermaid-svg-lyZaWABmolygbysg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lyZaWABmolygbysg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lyZaWABmolygbysg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lyZaWABmolygbysg :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
int* p = nullptr
使用前判空?
if (p) { *p } ✅ 安全
*p 💥 段错误
3️⃣ 指针与数组:数组名就是首地址
3.1 数组名退化为指针
#include <iostream>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int* p = arr; // ✅ 数组名退化为首元素地址,等价于 &arr[0]
std::cout << *p << "\\n"; // 10
std::cout << *(p+1) << "\\n"; // 20
std::cout << p[2] << "\\n"; // 30(指针也能用下标)
}
#mermaid-svg-j7tnploREa1Bqj93{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-j7tnploREa1Bqj93 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-j7tnploREa1Bqj93 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-j7tnploREa1Bqj93 .error-icon{fill:#552222;}#mermaid-svg-j7tnploREa1Bqj93 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-j7tnploREa1Bqj93 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-j7tnploREa1Bqj93 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-j7tnploREa1Bqj93 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-j7tnploREa1Bqj93 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-j7tnploREa1Bqj93 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-j7tnploREa1Bqj93 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-j7tnploREa1Bqj93 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-j7tnploREa1Bqj93 .marker.cross{stroke:#333333;}#mermaid-svg-j7tnploREa1Bqj93 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-j7tnploREa1Bqj93 p{margin:0;}#mermaid-svg-j7tnploREa1Bqj93 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-j7tnploREa1Bqj93 .cluster-label text{fill:#333;}#mermaid-svg-j7tnploREa1Bqj93 .cluster-label span{color:#333;}#mermaid-svg-j7tnploREa1Bqj93 .cluster-label span p{background-color:transparent;}#mermaid-svg-j7tnploREa1Bqj93 .label text,#mermaid-svg-j7tnploREa1Bqj93 span{fill:#333;color:#333;}#mermaid-svg-j7tnploREa1Bqj93 .node rect,#mermaid-svg-j7tnploREa1Bqj93 .node circle,#mermaid-svg-j7tnploREa1Bqj93 .node ellipse,#mermaid-svg-j7tnploREa1Bqj93 .node polygon,#mermaid-svg-j7tnploREa1Bqj93 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-j7tnploREa1Bqj93 .rough-node .label text,#mermaid-svg-j7tnploREa1Bqj93 .node .label text,#mermaid-svg-j7tnploREa1Bqj93 .image-shape .label,#mermaid-svg-j7tnploREa1Bqj93 .icon-shape .label{text-anchor:middle;}#mermaid-svg-j7tnploREa1Bqj93 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-j7tnploREa1Bqj93 .rough-node .label,#mermaid-svg-j7tnploREa1Bqj93 .node .label,#mermaid-svg-j7tnploREa1Bqj93 .image-shape .label,#mermaid-svg-j7tnploREa1Bqj93 .icon-shape .label{text-align:center;}#mermaid-svg-j7tnploREa1Bqj93 .node.clickable{cursor:pointer;}#mermaid-svg-j7tnploREa1Bqj93 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-j7tnploREa1Bqj93 .arrowheadPath{fill:#333333;}#mermaid-svg-j7tnploREa1Bqj93 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-j7tnploREa1Bqj93 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-j7tnploREa1Bqj93 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j7tnploREa1Bqj93 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-j7tnploREa1Bqj93 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j7tnploREa1Bqj93 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-j7tnploREa1Bqj93 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-j7tnploREa1Bqj93 .cluster text{fill:#333;}#mermaid-svg-j7tnploREa1Bqj93 .cluster span{color:#333;}#mermaid-svg-j7tnploREa1Bqj93 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-j7tnploREa1Bqj93 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-j7tnploREa1Bqj93 rect.text{fill:none;stroke-width:0;}#mermaid-svg-j7tnploREa1Bqj93 .icon-shape,#mermaid-svg-j7tnploREa1Bqj93 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j7tnploREa1Bqj93 .icon-shape p,#mermaid-svg-j7tnploREa1Bqj93 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-j7tnploREa1Bqj93 .icon-shape .label rect,#mermaid-svg-j7tnploREa1Bqj93 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j7tnploREa1Bqj93 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-j7tnploREa1Bqj93 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-j7tnploREa1Bqj93 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
*p
*(p+1)
p[2]
arr[10][20][30][40][50]0x100 0x104 0x108 …
p = arr → 0x100
10
20
30
3.2 两个 sizeof 陷阱
int arr[5] = {1, 2, 3, 4, 5};
int* p = arr;
std::cout << sizeof(arr) << "\\n"; // 20(5 × 4 字节,数组本身大小)
std::cout << sizeof(p) << "\\n"; // 8(指针大小)
⚠️ 数组名退化后丢失长度信息——这就是为什么传数组给函数时,必须额外传长度:
// ❌ 错误:函数内 sizeof(arr) 是指针大小
void badPrint(int arr[]) {
// sizeof(arr) == 8,不是数组真实大小
}
// ✅ 正确:额外传长度
void goodPrint(const int* arr, int n) {
for (int i = 0; i < n; ++i) {
std::cout << arr[i] << " ";
}
}
4️⃣ 指针算术:只能同类型指针相减
4.1 合法运算
int arr[5] = {10, 20, 30, 40, 50};
int* p = arr;
p++; // ✅ 指向 arr[1],地址 +sizeof(int)
p += 2; // ✅ 指向 arr[3]
int* q = p – 1; // ✅ 指向 arr[2]
std::ptrdiff_t d = p – q; // ✅ 同类型指针相减,得到元素个数(不是字节差)
#mermaid-svg-VWIepmIEZ5sK6nvI{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VWIepmIEZ5sK6nvI .error-icon{fill:#552222;}#mermaid-svg-VWIepmIEZ5sK6nvI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VWIepmIEZ5sK6nvI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VWIepmIEZ5sK6nvI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VWIepmIEZ5sK6nvI .marker.cross{stroke:#333333;}#mermaid-svg-VWIepmIEZ5sK6nvI svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VWIepmIEZ5sK6nvI p{margin:0;}#mermaid-svg-VWIepmIEZ5sK6nvI .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-VWIepmIEZ5sK6nvI .cluster-label text{fill:#333;}#mermaid-svg-VWIepmIEZ5sK6nvI .cluster-label span{color:#333;}#mermaid-svg-VWIepmIEZ5sK6nvI .cluster-label span p{background-color:transparent;}#mermaid-svg-VWIepmIEZ5sK6nvI .label text,#mermaid-svg-VWIepmIEZ5sK6nvI span{fill:#333;color:#333;}#mermaid-svg-VWIepmIEZ5sK6nvI .node rect,#mermaid-svg-VWIepmIEZ5sK6nvI .node circle,#mermaid-svg-VWIepmIEZ5sK6nvI .node ellipse,#mermaid-svg-VWIepmIEZ5sK6nvI .node polygon,#mermaid-svg-VWIepmIEZ5sK6nvI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VWIepmIEZ5sK6nvI .rough-node .label text,#mermaid-svg-VWIepmIEZ5sK6nvI .node .label text,#mermaid-svg-VWIepmIEZ5sK6nvI .image-shape .label,#mermaid-svg-VWIepmIEZ5sK6nvI .icon-shape .label{text-anchor:middle;}#mermaid-svg-VWIepmIEZ5sK6nvI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VWIepmIEZ5sK6nvI .rough-node .label,#mermaid-svg-VWIepmIEZ5sK6nvI .node .label,#mermaid-svg-VWIepmIEZ5sK6nvI .image-shape .label,#mermaid-svg-VWIepmIEZ5sK6nvI .icon-shape .label{text-align:center;}#mermaid-svg-VWIepmIEZ5sK6nvI .node.clickable{cursor:pointer;}#mermaid-svg-VWIepmIEZ5sK6nvI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VWIepmIEZ5sK6nvI .arrowheadPath{fill:#333333;}#mermaid-svg-VWIepmIEZ5sK6nvI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VWIepmIEZ5sK6nvI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VWIepmIEZ5sK6nvI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VWIepmIEZ5sK6nvI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VWIepmIEZ5sK6nvI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VWIepmIEZ5sK6nvI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VWIepmIEZ5sK6nvI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VWIepmIEZ5sK6nvI .cluster text{fill:#333;}#mermaid-svg-VWIepmIEZ5sK6nvI .cluster span{color:#333;}#mermaid-svg-VWIepmIEZ5sK6nvI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VWIepmIEZ5sK6nvI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VWIepmIEZ5sK6nvI rect.text{fill:none;stroke-width:0;}#mermaid-svg-VWIepmIEZ5sK6nvI .icon-shape,#mermaid-svg-VWIepmIEZ5sK6nvI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VWIepmIEZ5sK6nvI .icon-shape p,#mermaid-svg-VWIepmIEZ5sK6nvI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VWIepmIEZ5sK6nvI .icon-shape .label rect,#mermaid-svg-VWIepmIEZ5sK6nvI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VWIepmIEZ5sK6nvI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VWIepmIEZ5sK6nvI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VWIepmIEZ5sK6nvI :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
p++
p += 2
arr[0]0x100
arr[1]0x104
arr[2]0x108
arr[3]0x10C
arr[4]0x110
p = arr
4.2 非法运算
int* p = arr;
double* d = nullptr;
// ❌ 不同类型指针不能相减
// auto x = p – d;
// ❌ 指针不能相加
// auto y = p + d;
// ❌ 不能越过数组末尾再解引用
// int bad = *(arr + 5); // 越界,UB
💡 规则:指针算术只在同一个数组内有意义;越界访问是未定义行为(UB)。
5️⃣ const 与指针:三种组合必须分清
5.1 三种组合对照表
| const int* p | 指向 const int 的指针 | ✅ | ❌ | 值不能改 |
| int* const p | const 指针,指向 int | ❌ | ✅ | 指针不能改 |
| const int* const p | const 指针,指向 const int | ❌ | ❌ | 都不能改 |
int a = 1, b = 2;
const int* p1 = &a; // 指向只读
// *p1 = 10; // ❌ 不能改值
p1 = &b; // ✅ 可以改指向
int* const p2 = &a; // 指针本身只读
*p2 = 10; // ✅ 可以改值
// p2 = &b; // ❌ 不能改指向
const int* const p3 = &a;
// *p3 = 10; // ❌
// p3 = &b; // ❌
5.2 从右往左读法
const int* p; // p is a pointer to const int → 值只读
int* const p; // p is a const pointer to int → 指针只读
const int* const p; // p is a const pointer to const int → 都只读
#mermaid-svg-UpQKNQIWbrXtYAtb{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UpQKNQIWbrXtYAtb .error-icon{fill:#552222;}#mermaid-svg-UpQKNQIWbrXtYAtb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UpQKNQIWbrXtYAtb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UpQKNQIWbrXtYAtb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UpQKNQIWbrXtYAtb .marker.cross{stroke:#333333;}#mermaid-svg-UpQKNQIWbrXtYAtb svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UpQKNQIWbrXtYAtb p{margin:0;}#mermaid-svg-UpQKNQIWbrXtYAtb .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-UpQKNQIWbrXtYAtb .cluster-label text{fill:#333;}#mermaid-svg-UpQKNQIWbrXtYAtb .cluster-label span{color:#333;}#mermaid-svg-UpQKNQIWbrXtYAtb .cluster-label span p{background-color:transparent;}#mermaid-svg-UpQKNQIWbrXtYAtb .label text,#mermaid-svg-UpQKNQIWbrXtYAtb span{fill:#333;color:#333;}#mermaid-svg-UpQKNQIWbrXtYAtb .node rect,#mermaid-svg-UpQKNQIWbrXtYAtb .node circle,#mermaid-svg-UpQKNQIWbrXtYAtb .node ellipse,#mermaid-svg-UpQKNQIWbrXtYAtb .node polygon,#mermaid-svg-UpQKNQIWbrXtYAtb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UpQKNQIWbrXtYAtb .rough-node .label text,#mermaid-svg-UpQKNQIWbrXtYAtb .node .label text,#mermaid-svg-UpQKNQIWbrXtYAtb .image-shape .label,#mermaid-svg-UpQKNQIWbrXtYAtb .icon-shape .label{text-anchor:middle;}#mermaid-svg-UpQKNQIWbrXtYAtb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UpQKNQIWbrXtYAtb .rough-node .label,#mermaid-svg-UpQKNQIWbrXtYAtb .node .label,#mermaid-svg-UpQKNQIWbrXtYAtb .image-shape .label,#mermaid-svg-UpQKNQIWbrXtYAtb .icon-shape .label{text-align:center;}#mermaid-svg-UpQKNQIWbrXtYAtb .node.clickable{cursor:pointer;}#mermaid-svg-UpQKNQIWbrXtYAtb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UpQKNQIWbrXtYAtb .arrowheadPath{fill:#333333;}#mermaid-svg-UpQKNQIWbrXtYAtb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UpQKNQIWbrXtYAtb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UpQKNQIWbrXtYAtb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UpQKNQIWbrXtYAtb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UpQKNQIWbrXtYAtb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UpQKNQIWbrXtYAtb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UpQKNQIWbrXtYAtb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UpQKNQIWbrXtYAtb .cluster text{fill:#333;}#mermaid-svg-UpQKNQIWbrXtYAtb .cluster span{color:#333;}#mermaid-svg-UpQKNQIWbrXtYAtb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UpQKNQIWbrXtYAtb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UpQKNQIWbrXtYAtb rect.text{fill:none;stroke-width:0;}#mermaid-svg-UpQKNQIWbrXtYAtb .icon-shape,#mermaid-svg-UpQKNQIWbrXtYAtb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UpQKNQIWbrXtYAtb .icon-shape p,#mermaid-svg-UpQKNQIWbrXtYAtb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UpQKNQIWbrXtYAtb .icon-shape .label rect,#mermaid-svg-UpQKNQIWbrXtYAtb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UpQKNQIWbrXtYAtb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UpQKNQIWbrXtYAtb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UpQKNQIWbrXtYAtb :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
const int* p
const 在 * 左边→ 值不可改
int* const p
const 在 * 右边→ 指针不可改
const int* const p
两边都有 const→ 都不可改
💡 函数参数最常用 const int*:既零拷贝,又保证函数内不改调用者的数据。
6️⃣ 引用:必须绑定、不能改绑、不能为空
6.1 引用的三条铁律
int a = 10;
int& r = a; // ① 必须初始化(绑定)
r = 20; // 改 r 就是改 a,a 现在是 20
int b = 30;
r = b; // ⚠️ 这不是改绑!是把 b 的值赋给 a,a 变成 30
// r 永远还是 a 的别名
| ① 必须初始化 | int& r; ❌ 编译错误 |
| ② 不能改绑 | r = b 是赋值,不是改指向 |
| ③ 不能为空 | 没有"空引用" |
6.2 引用就是"别名"
#include <iostream>
int main() {
int a = 10;
int& r = a;
std::cout << &a << "\\n";
std::cout << &r << "\\n"; // 地址完全相同 → r 就是 a
r = 100;
std::cout << a << "\\n"; // 100
}
#mermaid-svg-T9KZzNKoF7VyOUEB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-T9KZzNKoF7VyOUEB .error-icon{fill:#552222;}#mermaid-svg-T9KZzNKoF7VyOUEB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-T9KZzNKoF7VyOUEB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-T9KZzNKoF7VyOUEB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-T9KZzNKoF7VyOUEB .marker.cross{stroke:#333333;}#mermaid-svg-T9KZzNKoF7VyOUEB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-T9KZzNKoF7VyOUEB p{margin:0;}#mermaid-svg-T9KZzNKoF7VyOUEB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-T9KZzNKoF7VyOUEB .cluster-label text{fill:#333;}#mermaid-svg-T9KZzNKoF7VyOUEB .cluster-label span{color:#333;}#mermaid-svg-T9KZzNKoF7VyOUEB .cluster-label span p{background-color:transparent;}#mermaid-svg-T9KZzNKoF7VyOUEB .label text,#mermaid-svg-T9KZzNKoF7VyOUEB span{fill:#333;color:#333;}#mermaid-svg-T9KZzNKoF7VyOUEB .node rect,#mermaid-svg-T9KZzNKoF7VyOUEB .node circle,#mermaid-svg-T9KZzNKoF7VyOUEB .node ellipse,#mermaid-svg-T9KZzNKoF7VyOUEB .node polygon,#mermaid-svg-T9KZzNKoF7VyOUEB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-T9KZzNKoF7VyOUEB .rough-node .label text,#mermaid-svg-T9KZzNKoF7VyOUEB .node .label text,#mermaid-svg-T9KZzNKoF7VyOUEB .image-shape .label,#mermaid-svg-T9KZzNKoF7VyOUEB .icon-shape .label{text-anchor:middle;}#mermaid-svg-T9KZzNKoF7VyOUEB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-T9KZzNKoF7VyOUEB .rough-node .label,#mermaid-svg-T9KZzNKoF7VyOUEB .node .label,#mermaid-svg-T9KZzNKoF7VyOUEB .image-shape .label,#mermaid-svg-T9KZzNKoF7VyOUEB .icon-shape .label{text-align:center;}#mermaid-svg-T9KZzNKoF7VyOUEB .node.clickable{cursor:pointer;}#mermaid-svg-T9KZzNKoF7VyOUEB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-T9KZzNKoF7VyOUEB .arrowheadPath{fill:#333333;}#mermaid-svg-T9KZzNKoF7VyOUEB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-T9KZzNKoF7VyOUEB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-T9KZzNKoF7VyOUEB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-T9KZzNKoF7VyOUEB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-T9KZzNKoF7VyOUEB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-T9KZzNKoF7VyOUEB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-T9KZzNKoF7VyOUEB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-T9KZzNKoF7VyOUEB .cluster text{fill:#333;}#mermaid-svg-T9KZzNKoF7VyOUEB .cluster span{color:#333;}#mermaid-svg-T9KZzNKoF7VyOUEB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-T9KZzNKoF7VyOUEB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-T9KZzNKoF7VyOUEB rect.text{fill:none;stroke-width:0;}#mermaid-svg-T9KZzNKoF7VyOUEB .icon-shape,#mermaid-svg-T9KZzNKoF7VyOUEB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-T9KZzNKoF7VyOUEB .icon-shape p,#mermaid-svg-T9KZzNKoF7VyOUEB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-T9KZzNKoF7VyOUEB .icon-shape .label rect,#mermaid-svg-T9KZzNKoF7VyOUEB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-T9KZzNKoF7VyOUEB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-T9KZzNKoF7VyOUEB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-T9KZzNKoF7VyOUEB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
完全等同
a地址 0x100值 10
r就是 a 的别名不占独立内存
6.3 引用作为函数参数(零拷贝 + 可改)
void swap(int& x, int& y) {
int tmp = x;
x = y;
y = tmp;
}
int main() {
int a = 1, b = 2;
swap(a, b); // ✅ 直接传变量,语法和值传递一样
// a == 2, b == 1
}
💡 对比指针版 swap(int* x, int* y):调用要写 swap(&a, &b),函数内要写 *x,引用版更简洁安全。
6.4 const 引用:零拷贝 + 只读(大对象首选)
#include <string>
void print(const std::string& s) { // ✅ 不拷贝,且不修改
// s += "x"; // ❌ 编译错误
std::cout << s;
}
7️⃣ 指针 vs 引用:一张表说清
| 可为空 | ✅ nullptr | ❌ 必须绑定 |
| 必须初始化 | ❌(但危险) | ✅ |
| 能否改绑 | ✅ | ❌ |
| 占独立内存 | ✅ 8 字节 | ❌(语义上不是对象) |
| 多级 | ✅ int** | ❌ |
| 指针算术 | ✅ | ❌ |
| 调用写法 | f(&a) | f(a) |
| 函数内使用 | *p | r |
| 安全性 | 低 | 高 |
| 典型场景 | 动态内存、数据结构、C API、可选参数 | 函数参数、运算符重载、RAII |
#mermaid-svg-GSqpNADbPaWhPIgC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GSqpNADbPaWhPIgC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GSqpNADbPaWhPIgC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GSqpNADbPaWhPIgC .error-icon{fill:#552222;}#mermaid-svg-GSqpNADbPaWhPIgC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GSqpNADbPaWhPIgC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GSqpNADbPaWhPIgC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GSqpNADbPaWhPIgC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GSqpNADbPaWhPIgC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GSqpNADbPaWhPIgC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GSqpNADbPaWhPIgC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GSqpNADbPaWhPIgC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GSqpNADbPaWhPIgC .marker.cross{stroke:#333333;}#mermaid-svg-GSqpNADbPaWhPIgC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GSqpNADbPaWhPIgC p{margin:0;}#mermaid-svg-GSqpNADbPaWhPIgC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-GSqpNADbPaWhPIgC .cluster-label text{fill:#333;}#mermaid-svg-GSqpNADbPaWhPIgC .cluster-label span{color:#333;}#mermaid-svg-GSqpNADbPaWhPIgC .cluster-label span p{background-color:transparent;}#mermaid-svg-GSqpNADbPaWhPIgC .label text,#mermaid-svg-GSqpNADbPaWhPIgC span{fill:#333;color:#333;}#mermaid-svg-GSqpNADbPaWhPIgC .node rect,#mermaid-svg-GSqpNADbPaWhPIgC .node circle,#mermaid-svg-GSqpNADbPaWhPIgC .node ellipse,#mermaid-svg-GSqpNADbPaWhPIgC .node polygon,#mermaid-svg-GSqpNADbPaWhPIgC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GSqpNADbPaWhPIgC .rough-node .label text,#mermaid-svg-GSqpNADbPaWhPIgC .node .label text,#mermaid-svg-GSqpNADbPaWhPIgC .image-shape .label,#mermaid-svg-GSqpNADbPaWhPIgC .icon-shape .label{text-anchor:middle;}#mermaid-svg-GSqpNADbPaWhPIgC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GSqpNADbPaWhPIgC .rough-node .label,#mermaid-svg-GSqpNADbPaWhPIgC .node .label,#mermaid-svg-GSqpNADbPaWhPIgC .image-shape .label,#mermaid-svg-GSqpNADbPaWhPIgC .icon-shape .label{text-align:center;}#mermaid-svg-GSqpNADbPaWhPIgC .node.clickable{cursor:pointer;}#mermaid-svg-GSqpNADbPaWhPIgC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GSqpNADbPaWhPIgC .arrowheadPath{fill:#333333;}#mermaid-svg-GSqpNADbPaWhPIgC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GSqpNADbPaWhPIgC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GSqpNADbPaWhPIgC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GSqpNADbPaWhPIgC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GSqpNADbPaWhPIgC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GSqpNADbPaWhPIgC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GSqpNADbPaWhPIgC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GSqpNADbPaWhPIgC .cluster text{fill:#333;}#mermaid-svg-GSqpNADbPaWhPIgC .cluster span{color:#333;}#mermaid-svg-GSqpNADbPaWhPIgC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GSqpNADbPaWhPIgC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GSqpNADbPaWhPIgC rect.text{fill:none;stroke-width:0;}#mermaid-svg-GSqpNADbPaWhPIgC .icon-shape,#mermaid-svg-GSqpNADbPaWhPIgC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GSqpNADbPaWhPIgC .icon-shape p,#mermaid-svg-GSqpNADbPaWhPIgC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GSqpNADbPaWhPIgC .icon-shape .label rect,#mermaid-svg-GSqpNADbPaWhPIgC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GSqpNADbPaWhPIgC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GSqpNADbPaWhPIgC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GSqpNADbPaWhPIgC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
是
否
大
小
是
需要间接访问对象
参数可能不传(空)?
用指针 T*函数内判空
需要修改实参?
用引用 T&
对象大吗?
const T& ✅ 零拷贝只读
按值 T
需要指针算术/遍历数组?
用指针 T*
💡 口诀:必传要改 T&,必传只读大对象 const T&,可选参数 T*,要遍历用 T*。
8️⃣ 危险区:野指针、悬空指针、悬空引用
8.1 三种"坏指针/引用"
| 野指针 | 未初始化的指针 | int* p; 后直接 *p |
| 悬空指针 | 指向已释放内存的指针 | delete p; 后继续用 p |
| 悬空引用 | 绑定到已销毁对象的引用 | 返回局部变量的引用 |
8.2 野指针
int* p; // ⚠️ 未初始化,p 里是垃圾值
// *p = 10; // 💥 UB,可能崩溃也可能改坏别的内存
int* q = nullptr; // ✅ 初始化为空
if (q) { *q = 10; } // 安全
8.3 悬空指针(第 6 周详讲,先认识)
int* p = new int(10);
delete p; // 内存已释放
// *p = 20; // 💥 悬空指针,UB
p = nullptr; // ✅ 释放后立即置空,防止误用
8.4 悬空引用(本周重点)
// ❌ 返回局部变量的引用 → 悬空
int& badRef() {
int local = 10;
return local; // local 在函数结束就销毁了
}
// ✅ 返回值(拷贝)
int goodValue() {
int local = 10;
return local;
}
// ✅ 返回静态变量(生命周期到程序结束)
int& goodRef() {
static int x = 10;
return x;
}
#mermaid-svg-iBoNiJv5soSjOCjo{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iBoNiJv5soSjOCjo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iBoNiJv5soSjOCjo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iBoNiJv5soSjOCjo .error-icon{fill:#552222;}#mermaid-svg-iBoNiJv5soSjOCjo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iBoNiJv5soSjOCjo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iBoNiJv5soSjOCjo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iBoNiJv5soSjOCjo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iBoNiJv5soSjOCjo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iBoNiJv5soSjOCjo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iBoNiJv5soSjOCjo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iBoNiJv5soSjOCjo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iBoNiJv5soSjOCjo .marker.cross{stroke:#333333;}#mermaid-svg-iBoNiJv5soSjOCjo svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iBoNiJv5soSjOCjo p{margin:0;}#mermaid-svg-iBoNiJv5soSjOCjo .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-iBoNiJv5soSjOCjo .cluster-label text{fill:#333;}#mermaid-svg-iBoNiJv5soSjOCjo .cluster-label span{color:#333;}#mermaid-svg-iBoNiJv5soSjOCjo .cluster-label span p{background-color:transparent;}#mermaid-svg-iBoNiJv5soSjOCjo .label text,#mermaid-svg-iBoNiJv5soSjOCjo span{fill:#333;color:#333;}#mermaid-svg-iBoNiJv5soSjOCjo .node rect,#mermaid-svg-iBoNiJv5soSjOCjo .node circle,#mermaid-svg-iBoNiJv5soSjOCjo .node ellipse,#mermaid-svg-iBoNiJv5soSjOCjo .node polygon,#mermaid-svg-iBoNiJv5soSjOCjo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iBoNiJv5soSjOCjo .rough-node .label text,#mermaid-svg-iBoNiJv5soSjOCjo .node .label text,#mermaid-svg-iBoNiJv5soSjOCjo .image-shape .label,#mermaid-svg-iBoNiJv5soSjOCjo .icon-shape .label{text-anchor:middle;}#mermaid-svg-iBoNiJv5soSjOCjo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iBoNiJv5soSjOCjo .rough-node .label,#mermaid-svg-iBoNiJv5soSjOCjo .node .label,#mermaid-svg-iBoNiJv5soSjOCjo .image-shape .label,#mermaid-svg-iBoNiJv5soSjOCjo .icon-shape .label{text-align:center;}#mermaid-svg-iBoNiJv5soSjOCjo .node.clickable{cursor:pointer;}#mermaid-svg-iBoNiJv5soSjOCjo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iBoNiJv5soSjOCjo .arrowheadPath{fill:#333333;}#mermaid-svg-iBoNiJv5soSjOCjo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iBoNiJv5soSjOCjo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iBoNiJv5soSjOCjo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iBoNiJv5soSjOCjo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iBoNiJv5soSjOCjo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iBoNiJv5soSjOCjo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iBoNiJv5soSjOCjo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iBoNiJv5soSjOCjo .cluster text{fill:#333;}#mermaid-svg-iBoNiJv5soSjOCjo .cluster span{color:#333;}#mermaid-svg-iBoNiJv5soSjOCjo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iBoNiJv5soSjOCjo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iBoNiJv5soSjOCjo rect.text{fill:none;stroke-width:0;}#mermaid-svg-iBoNiJv5soSjOCjo .icon-shape,#mermaid-svg-iBoNiJv5soSjOCjo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iBoNiJv5soSjOCjo .icon-shape p,#mermaid-svg-iBoNiJv5soSjOCjo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iBoNiJv5soSjOCjo .icon-shape .label rect,#mermaid-svg-iBoNiJv5soSjOCjo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iBoNiJv5soSjOCjo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iBoNiJv5soSjOCjo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iBoNiJv5soSjOCjo :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
局部变量
static / 全局
成员变量
参数引用
函数返回引用
引用的对象生命周期?
❌ 悬空引用,UB
✅ 安全
✅ 安全(对象还活着时)
⚠️ 取决于调用者传的对象
💡 规则:返回引用前先问自己——这个对象在函数返回后还活着吗?
9️⃣ 本周高频面试题(5 道)
| 1 | 指针和引用的区别? | 基础对比 | 引用必须初始化、不能为空、不能改绑、不占独立内存、无多级;指针反之,更灵活但更危险 |
| 2 | const int* 和 int* const 的区别? | const 与指针 | 前者指向的值只读,指针可改指向;后者指针本身只读,值可改 |
| 3 | 数组名和指针有什么区别? | 数组退化 | 数组名不是指针,但会退化为首元素地址;sizeof(arr) 是数组大小,sizeof(p) 是指针大小 |
| 4 | 什么是野指针和悬空指针? | 内存安全 | 野指针:未初始化;悬空指针:指向已释放内存;防范:初始化 nullptr、释放后置空 |
| 5 | 为什么不能返回局部变量的引用? | 生命周期 | 函数结束局部变量销毁,引用悬空,访问是 UB |
🔟 本周项目验收:手写一个动态数组(简化版)
需求:用裸指针 + 手动内存管理实现一个 int 动态数组,支持:
验收标准:
- 指针定义时初始化(nullptr 或 new)
- delete 后指针置 nullptr
- 扩容时用 new int[newCap] + 循环拷贝 + delete[] old
- operator[] 提供 const 和非 const 两个版本
- 打印函数参数用 const int*(只读零拷贝)
- 用 -fsanitize=address 编译运行,无内存错误
- 所有指针使用前判空
参考骨架:
#include <iostream>
#include <cstddef>
class IntArray {
public:
explicit IntArray(std::size_t cap = 4)
: data_(new int[cap]), size_(0), capacity_(cap) {}
~IntArray() {
delete[] data_;
data_ = nullptr; // ✅ 释放后置空
}
// 禁止拷贝(简化版,第 9 周学 Rule of Three 后再实现)
IntArray(const IntArray&) = delete;
IntArray& operator=(const IntArray&) = delete;
void push_back(int value) {
if (size_ == capacity_) {
grow();
}
data_[size_++] = value;
}
std::size_t size() const { return size_; }
std::size_t capacity() const { return capacity_; }
int& operator[](std::size_t i) { return data_[i]; }
const int& operator[](std::size_t i) const { return data_[i]; }
private:
void grow() {
std::size_t newCap = capacity_ * 2;
int* newData = new int[newCap]; // ① 申请新内存
for (std::size_t i = 0; i < size_; ++i) {
newData[i] = data_[i]; // ② 拷贝
}
delete[] data_; // ③ 释放旧内存
data_ = newData; // ④ 指向新内存
capacity_ = newCap;
}
int* data_;
std::size_t size_;
std::size_t capacity_;
};
// ✅ 只读打印:const int* 零拷贝 + 防修改
void printArray(const int* arr, std::size_t n) {
for (std::size_t i = 0; i < n; ++i) {
std::cout << arr[i] << " ";
}
std::cout << "\\n";
}
int main() {
IntArray a;
for (int i = 0; i < 10; ++i) {
a.push_back(i * 10);
}
std::cout << "size = " << a.size()
<< ", capacity = " << a.capacity() << "\\n";
printArray(&a[0], a.size()); // 传首地址 + 长度
return 0;
}
编译运行:
g++ -std=c++17 -g -O0 -fsanitize=address -Wall -Wextra week5.cpp -o week5.exe
./week5.exe
预期输出:
size = 10, capacity = 16
0 10 20 30 40 50 60 70 80 90
💡 这个 IntArray 就是 std::vector 的雏形。第 6 周学完动态内存管理后,你会发现它还能写得更安全;第 9 周学完 Rule of Three 后,还能补上拷贝/移动语义。
1️⃣1️⃣ 本周避坑速查表(贴墙版)
#mermaid-svg-wAYYQjyi4IuVoULR{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wAYYQjyi4IuVoULR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wAYYQjyi4IuVoULR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wAYYQjyi4IuVoULR .error-icon{fill:#552222;}#mermaid-svg-wAYYQjyi4IuVoULR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wAYYQjyi4IuVoULR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wAYYQjyi4IuVoULR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wAYYQjyi4IuVoULR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wAYYQjyi4IuVoULR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wAYYQjyi4IuVoULR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wAYYQjyi4IuVoULR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wAYYQjyi4IuVoULR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wAYYQjyi4IuVoULR .marker.cross{stroke:#333333;}#mermaid-svg-wAYYQjyi4IuVoULR svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wAYYQjyi4IuVoULR p{margin:0;}#mermaid-svg-wAYYQjyi4IuVoULR .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wAYYQjyi4IuVoULR .cluster-label text{fill:#333;}#mermaid-svg-wAYYQjyi4IuVoULR .cluster-label span{color:#333;}#mermaid-svg-wAYYQjyi4IuVoULR .cluster-label span p{background-color:transparent;}#mermaid-svg-wAYYQjyi4IuVoULR .label text,#mermaid-svg-wAYYQjyi4IuVoULR span{fill:#333;color:#333;}#mermaid-svg-wAYYQjyi4IuVoULR .node rect,#mermaid-svg-wAYYQjyi4IuVoULR .node circle,#mermaid-svg-wAYYQjyi4IuVoULR .node ellipse,#mermaid-svg-wAYYQjyi4IuVoULR .node polygon,#mermaid-svg-wAYYQjyi4IuVoULR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wAYYQjyi4IuVoULR .rough-node .label text,#mermaid-svg-wAYYQjyi4IuVoULR .node .label text,#mermaid-svg-wAYYQjyi4IuVoULR .image-shape .label,#mermaid-svg-wAYYQjyi4IuVoULR .icon-shape .label{text-anchor:middle;}#mermaid-svg-wAYYQjyi4IuVoULR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wAYYQjyi4IuVoULR .rough-node .label,#mermaid-svg-wAYYQjyi4IuVoULR .node .label,#mermaid-svg-wAYYQjyi4IuVoULR .image-shape .label,#mermaid-svg-wAYYQjyi4IuVoULR .icon-shape .label{text-align:center;}#mermaid-svg-wAYYQjyi4IuVoULR .node.clickable{cursor:pointer;}#mermaid-svg-wAYYQjyi4IuVoULR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wAYYQjyi4IuVoULR .arrowheadPath{fill:#333333;}#mermaid-svg-wAYYQjyi4IuVoULR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wAYYQjyi4IuVoULR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wAYYQjyi4IuVoULR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wAYYQjyi4IuVoULR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wAYYQjyi4IuVoULR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wAYYQjyi4IuVoULR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wAYYQjyi4IuVoULR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wAYYQjyi4IuVoULR .cluster text{fill:#333;}#mermaid-svg-wAYYQjyi4IuVoULR .cluster span{color:#333;}#mermaid-svg-wAYYQjyi4IuVoULR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wAYYQjyi4IuVoULR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wAYYQjyi4IuVoULR rect.text{fill:none;stroke-width:0;}#mermaid-svg-wAYYQjyi4IuVoULR .icon-shape,#mermaid-svg-wAYYQjyi4IuVoULR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wAYYQjyi4IuVoULR .icon-shape p,#mermaid-svg-wAYYQjyi4IuVoULR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wAYYQjyi4IuVoULR .icon-shape .label rect,#mermaid-svg-wAYYQjyi4IuVoULR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wAYYQjyi4IuVoULR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wAYYQjyi4IuVoULR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wAYYQjyi4IuVoULR :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
第5周避坑清单
指针基础
数组
const 指针
引用
生命周期
定义就初始化 nullptr使用前判空释放后置空
数组名会退化sizeof 陷阱传数组必须传长度
const 在 * 左边=值只读const 在 * 右边=指针只读
必须初始化不能改绑不能为空
不返回局部变量引用/指针返回引用先问对象还活着吗
🎯 一句话总结:指针是"存地址的变量",灵活但危险;引用是"必须绑定、不能改绑、不能为空"的安全别名。 const 在 * 左边管值、在 * 右边管指针;数组名会退化成指针所以传参必须带长度;野指针靠初始化防、悬空指针靠释放后置空防、悬空引用靠"不返回局部变量"防。把本周的动态数组写完并跑通,阶段二的指针基础就算过关,可以进入第 6 周「动态内存管理」了。
![P11246 [GESP202409 六级] 小杨和整数拆分-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108100631-6af049a75855c-220x150.png)


![打卡信奥刷题(3678)用C++实现信奥题 P12274 [蓝桥杯 2024 国 Python B] 设计-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108053830-6af00ad6bdf8d-220x150.png)