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

关系图:指针 score address 保存 score 的地址并指向 score 的值

关键过程与易错点

  • int* p 表示“指向 int 的指针”。读代码时把 *p 看成“p 指向的那个整数”。
  • & 在表达式中是取地址,* 在表达式中是解引用;二者不是普通乘除运算符。
  • 指针必须先指向一个有效对象才能解引用。下面是错误的,因为 p 没有保存任何有效地址:
int* p;
// *p = 10; // 错误:不能通过未初始化的指针写数据
  • 不要把指针地址当成普通整数输出或计算。初学阶段无需关心地址的具体数值。
  • 数组名在很多表达式中能转换为指向首元素的地址,但数组和可修改的指针不是同一件事。处理数组时优先使用下标,清晰优先。

动手检查

定义 int number = 7; 和指向它的指针。先输出 number,再通过指针把它改成 42 并输出。确认两次访问的是同一个变量。

然后定义两个整数,分别令两个指针指向它们。只通过其中一个指针修改数值,观察另一个整数不受影响。

立即练习

难度 题目 题解 训练目标
基础 洛谷 P5735:距离函数 题解 将计算封装为函数;先用普通参数写清楚数据流。
巩固 洛谷 P5736:质数筛 题解 练习函数拆分和参数传递,不要求使用指针。