GESP C++ 4 级 · 知识点

指针类型的概念及基本应用

GESP C++ 四级要求理解指针保存地址的概念,掌握取地址、解引用以及指针与数组的基本关系。学指针要建立「变量有地址、指针存地址」的模型,而不是死记符号。

对应知识域:指针类型的概念及基本应用相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 理解指针变量保存的是另一个变量的内存地址,指针的类型决定它指向的数据类型。
  • 掌握取地址运算符与解引用运算符的用法,能通过指针读写信所指变量的值。
  • 理解指针与数组的联系:数组名可以看作首元素地址,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 表示空指针。解引用空指针是未定义行为,使用前必须检查。

本级别其他知识点

官方依据