考纲要求
- 理解指针变量保存的是另一个变量的内存地址,指针的类型决定它指向的数据类型。
- 掌握取地址运算符与解引用运算符的用法,能通过指针读写信所指变量的值。
- 理解指针与数组的联系:数组名可以看作首元素地址,p 加 i 指向下标 i 的元素。
- 知道空指针与野指针的危害,使用前必须让指针指向有效对象。
典型题型
- 给出指针相关代码,要求写出输出结果。
- 用指针遍历数组并统计或求和。
- 判断指针操作与变量修改之间的关系。
常见错误
- 声明指针后没有赋值就解引用,访问到随机地址导致崩溃。
- 把 p 与 *p 混淆,p 是地址,*p 是该地址上保存的值。
- 指针类型与所指对象类型不匹配,解引用后得到的值解释错误。
- 以为指针变量离开作用域会释放它指向的对象,实际只是指针本身失效。
深入理解
指针是存地址的变量
每个变量在内存里都有一个地址。&x 取出 x 的地址,int *p = &x; 声明 p 是一个「指向 int 的指针」,并让它保存 x 的地址。此后 *p 就是 x 本身,*p = 10 等价于 x = 10。
建立模型的关键是把「地址」当成普通的值:指针就是一个装着地址的变量,和装着整数的变量没有本质区别。& 是「取谁的地址」,* 是「按这个地址去访问」。分清这两个符号的作用,指针题就过了一半。
指针和数组是同一块地方
数组名在多数场合会被当成首元素的地址,所以 a 和 &a[0] 等价,*(a + i) 和 a[i] 也等价。指针加 1 不是加 1 个字节,而是移动一个元素的大小——对 int* 是加 4 字节,对 char* 是加 1 字节。
数组名本身不能被赋值(a = p 会报错),因为它不是指针变量,只是被当成地址使用;但指针变量可以指向数组的任意位置,也可以 p++ 往后走。这是两者唯一需要区分的地方。
空指针与野指针
空指针是明确指向「什么都没指」的指针,写 int *p = nullptr;。对空指针解引用会让程序崩溃,所以使用前应该判断 if (p != nullptr)。
野指针是没初始化就使用的指针,它保存的是一个随机地址。解引用野指针可能读到垃圾值,也可能改坏别的变量,而且编译器不会警告——危害比空指针大得多,因为空指针至少会立刻崩,野指针可能让程序在很远的地方出错。习惯是:指针定义时就初始化,不用了就置为 nullptr。
自编例题
通过指针修改数组元素
用指针遍历数组,把每个元素都乘以 2。
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
for (int i = 0; i < 5; i++) *(p + i) *= 2;数组名 a 在表达式中会转换成首元素地址,p 指向 a[0]。p 加 i 表示向后移动 i 个元素后的地址,解引用后得到 a[i],对它赋值就是修改原数组。*(p + i) 与 p[i] 完全等价,后者可读性更好。指针遍历需要自己保证不越界,越界访问不会报错,但会破坏其他数据或直接崩溃。空指针解引用同样危险,使用前应确认指针有效。
相关真题
这块内容在整条路线里的位置:GESP C++ 4 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
指针和引用有什么区别?
引用是变量的别名,必须初始化且不能改绑;指针是保存地址的变量,可以为空、可以改变指向,使用更灵活但风险更高。
为什么要用指针?
指针可以间接访问和修改数据、在函数间共享大块内存、实现动态数据结构,也是理解数组和字符串的基础。
空指针怎么表示?
现代 C++ 使用 nullptr 表示空指针。解引用空指针是未定义行为,使用前必须检查。
