GESP 四级 第 02 讲:指针与二维 / 多维数组

本讲定位:四级唯一的”新概念”重灾区。三级只学过一维数组,四级突然要同时消化指针二维数组,而且真题把两者合在一起考——2026 年 3 月四级真题第 3 题就是求 *(*(p + 2) + 1) 的值。学生如果只会 a[i][j] 而不懂它和指针的关系,这类题必错。

对应官方大纲:四级知识块 1「指针」——指针类型,指针类型定义变量,指针变量的赋值、解引用;知识块 2「二维及多维数组」——C++ 二维及多维数组的定义、使用(不包括变长数组)。

前置知识:第 01 讲(尤其是指针传参、& 的两种含义)、三级的一维数组。

代码说明:本讲代码均已用 g++ 11.5(-std=c++11)编译运行验证。涉及具体地址数值的输出因机器而异,文中只标注相对关系(如”相差 4 字节”),这部分是稳定的。


1. 先建立内存模型

讲指针之前,必须先让学生脑子里有这张图。没有内存模型,指针就是背符号;有了内存模型,指针题全是送分题。

内存 = 一排编了号的格子,每个格子 1 字节(8 个二进制位),格子的编号就叫地址

地址:  0x1000  0x1001  0x1002  0x1003  0x1004  0x1005 ...
      ┌───────┬───────┬───────┬───────┬───────┬───────┐
      │       │       │       │       │       │       │
      └───────┴───────┴───────┴───────┴───────┴───────┘
       └──────────  int a  ──────────┘
             (占 4 个格子)

常见类型占多少字节(必背):

类型 字节数 说明
char 1
bool 1
int 4 范围约 $\pm 2.1 \times 10^9$
long long 8 范围约 $\pm 9.2 \times 10^{18}$
float 4
double 8
任意指针 8 64 位系统上,int*char*double* 全都是 8

⚠️ 高频选择题sizeof(int*) 是多少?答案 8(64 位环境),和它指向什么类型无关——因为指针存的是地址,地址的长度是固定的。


2. 指针三件套:定义、赋值、解引用

官方大纲把指针拆成三个动作,我们就按这三个动作教。

2.1 定义

int  *p;        // p 是一个指针,它将来要指向一个 int
char *q;        // q 是一个指针,它将来要指向一个 char
double *r;      // 同理

读法:从右往左读。 int *p 读作”p 是一个指针,指向 int”。

⚠️ 星号的位置陷阱

int *a, b;      // a 是指针,b 是【普通 int】!
int *a, *b;     // 这样两个才都是指针

星号是跟着变量走的,不是跟着类型走的。这是判断题的常客。

2.2 赋值(让指针指向某个变量)

int x = 10;
int *p = &x;        // 把 x 的地址装进 p,此时说"p 指向 x"
     x               p
  ┌──────┐        ┌────────┐
  │  10  │ ←───── │ 0x1000 │
  └──────┘        └────────┘
  地址 0x1000      p 里装的是 x 的地址