欢迎光临
我们一直在努力

C++零基础入门第5周:指针与引用完全指南——从内存模型到 const 指针、悬空引用,一篇讲透(附20段可运行代码+避坑清单)

/* 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 引用:一张表说清

特性指针 T*引用 T&
可为空 ✅ 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 动态数组,支持:

  • 构造时指定初始容量,容量满时扩容(申请新内存 + 拷贝 + 释放旧内存)
  • 支持 push_back、size、capacity、operator[]
  • 析构时释放内存
  • 用 const 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 周「动态内存管理」了。


    赞(0)
    未经允许不得转载:171主机测评 » C++零基础入门第5周:指针与引用完全指南——从内存模型到 const 指针、悬空引用,一篇讲透(附20段可运行代码+避坑清单)
    分享到: 更多 (0)

    评论 抢沙发

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