C++ 竞赛入门
指针(选读)
指针(选读)
本节学会什么
- 区分变量的值和变量的地址
- 用
&取得地址,用*通过地址访问变量 - 知道指针可能指向什么,以及何时不该使用它
为什么需要它
这是一篇选读内容。完成函数单元后,你已经能处理快速入门中的必修题;本页的目标是读懂包含地址的基础代码,而不是在 OJ 题中刻意使用指针。
变量存放在内存中的某个位置。大多数入门题只需直接使用变量;当需要让一段代码访问或修改另一处已有的数据时,地址就是一种明确的“位置说明”。指针保存这个地址。
最小可运行示例
#include <iostream>
int main() {
int score = 80;
int* score_address = &score;
*score_address += 20;
std::cout << score << '\n';
return 0;
}
输出是 100。&score 得到变量 score 的地址;score_address 保存该地址;*score_address 表示这个地址处存放的整数。因此修改 *score_address,就是修改 score。
关键过程与易错点
int* p表示“指向int的指针”。读代码时把*p看成“p 指向的那个整数”。&在表达式中是取地址,*在表达式中是解引用;二者不是普通乘除运算符。- 指针必须先指向一个有效对象才能解引用。下面是错误的,因为
p没有保存任何有效地址:
int* p;
// *p = 10; // 错误:不能通过未初始化的指针写数据
- 不要把指针地址当成普通整数输出或计算。初学阶段无需关心地址的具体数值。
- 数组名在很多表达式中能转换为指向首元素的地址,但数组和可修改的指针不是同一件事。处理数组时优先使用下标,清晰优先。
动手检查
定义 int number = 7; 和指向它的指针。先输出 number,再通过指针把它改成 42 并输出。确认两次访问的是同一个变量。
然后定义两个整数,分别令两个指针指向它们。只通过其中一个指针修改数值,观察另一个整数不受影响。
立即练习
| 难度 | 题目 | 题解 | 训练目标 |
|---|---|---|---|
| 基础 | 洛谷 P5735:距离函数 | 题解 | 将计算封装为函数;先用普通参数写清楚数据流。 |
| 巩固 | 洛谷 P5736:质数筛 | 题解 | 练习函数拆分和参数传递,不要求使用指针。 |