4
指针
GESP 四级 · 知识点 1

📍 指针

电脑内存里每一格都有自己的「门牌号」。变量像贴了门牌的盒子,而指针就是专门记门牌号的小本本——拿着它,就能找到盒子、打开盒子、甚至改掉盒子里的东西。

考纲知识点:指针类型,指针类型定义变量,指针类型变量的赋值、解引用
📖
考纲 · 知识点详述
摘自《CCF编程能力等级认证 C++&Python 认证标准》C++ 四级
  1. (1)理解C++指针类型的概念,掌握指针类型变量的定义、赋值、解引用。
📚
先学一学
花 5 分钟读完下面 5 课,再去闯关就不慌啦
1
📦 变量是盒子,内存地址是门牌号

电脑的内存像一栋超大的公寓楼,每个房间都有一串门牌号。程序里写 int a = 10;,就是租一个「能放整数的房间」,把 10 放进去,门牌号由电脑分配。想问房间在几号,就在变量前面加一个 &

🧪 读代码:问地址
看得懂就好,不用背:
int a = 10;
cout << &a; // 输出 a 的门牌号,像 0x6ffe14
&a 读作「a 的地址」,输出的是一串像 0x6ffe14 的数字,长得怪但没关系——只要记住它是门牌号。
💡 口诀:& 变量 = 问门牌号;变量值 = 盒子里的东西。
2
🗂️ 指针变量:专门记门牌号的变量

普通变量存的是「东西」,指针变量存的是「门牌号」。想声明「能存 int 房间门牌号的指针」,写成 int* p;——多一个星号 * 表示它是指针。给它赋值就是让它记下某个变量的地址:

🧪 读代码:记下 a 的门牌号
看得懂就好,不用背:
int a = 10;
int* p;
p = &a; // p 记下 a 的门牌号
cout << p; // 输出和 &a 一样的门牌号
也可以一步写完:int* p = &a;。p 的类型是 int*(指向 int 的指针),它不能乱记 double 房间的门牌号。
💡 口诀:int* p = &a:p 是「记 int 地址」的指针,& 取地址填给它。
⚠️ 星号的两种身份别混
声明时的 int* p 里的星号是「我是指针」的记号;乘法 3 * 5 里的星号是「乘」;下面要学的解引用 *p 里的星号又是「按门牌号进屋」。同一个符号三种用法,看位置判断!
💡 口诀:声明带 * 是「我记地址」;单独 *p 是「进屋取货」;两个数中间 * 才是乘法。
3
🔑 解引用:拿着门牌号进屋拿东西

光记门牌号没意思,真正有用的是顺着门牌号找到房间、看里面的东西。在指针前加一个 * 就能「进屋」,这叫解引用(dereference):

🧪 读代码:透过指针看 a
看得懂就好,不用背:
int a = 10;
int* p = &a;
cout << *p; // 顺着门牌号进屋,取出 10
*p = 99; // 进屋把东西换成 99
cout << a; // a 也变成 99!
因为 p 记的就是 a 的门牌号,*p = 99 和直接改 a 是同一间房。最后输出 99
💡 口诀:p 是门牌号,*p 是屋里货;改 *p 就是改屋里货,原变量跟着变。
🆚 易混对比:p vs *p vs &a
· p = 门牌号(地址)。
· *p = 顺着门牌号进屋看到的东西(a 的值)。
· &a = 问 a 要门牌号,常用来给指针赋值。
💡 口诀:& 是「问地址」,* 是「进屋取货」;两个符号一左一右正好反着来。
4
📞 生活类比:指针像「朋友家的电话」

想找小明玩,你不用整天牵着他,只要记住他家的电话号码(地址)。想找小明时:

🌟 行业实际:指针帮大程序省力气
程序要处理海量数据(比如一亿人的成绩)时,如果每次都把整份数据复印一份传来传去会又慢又费内存。工程师选择只传「数据放在哪的地址」——就像只把仓库的地址告诉工人,而不是把整个仓库搬过去。很多大软件和操作系统的底层都靠指针。
💡 口诀:指针像电话——存地址、打电话、传话都方便;大程序省内存就靠它。
5
🧭 指针的规矩:类型要配对、别乱指
🔢 什么类型配什么指针
int* p 记 int 变量的地址;double* q 记 double 变量的地址;char* c 记 char 变量的地址。类型写错,解引用时会把房间里的东西读错。
💡 口诀:指针前面写什么类型,就只能记什么类型的门牌号。
⚠️ 最危险的坑:指针还没赋值就解引用
声明了 int* p; 却没告诉它地址,就去写 *p = 100;——等于拿着一张空门牌乱闯,可能改到别人的房间,程序会出大问题。拿不准时可以让它先等于 nullptr(谁都不指)。
💡 口诀:先 & 取地址,再 * 进屋;没地址别解引用,nullptr 当安全门牌。
🎯
闯关小锦囊 · 考点提醒
🎮
学完了?来闯关!
下面 15 个小挑战,点一点就能玩

Demo 原型 · 每个知识点独立页面 · 暂不含真实编译与进度存储。