本讲定位:四级唯一的”新概念”重灾区。三级只学过一维数组,四级突然要同时消化指针和二维数组,而且真题把两者合在一起考——2026 年 3 月四级真题第 3 题就是求
*(*(p + 2) + 1)的值。学生如果只会a[i][j]而不懂它和指针的关系,这类题必错。对应官方大纲:四级知识块 1「指针」——指针类型,指针类型定义变量,指针变量的赋值、解引用;知识块 2「二维及多维数组」——C++ 二维及多维数组的定义、使用(不包括变长数组)。
前置知识:第 01 讲(尤其是指针传参、
&的两种含义)、三级的一维数组。代码说明:本讲代码均已用 g++ 11.5(
-std=c++11)编译运行验证。涉及具体地址数值的输出因机器而异,文中只标注相对关系(如”相差 4 字节”),这部分是稳定的。
讲指针之前,必须先让学生脑子里有这张图。没有内存模型,指针就是背符号;有了内存模型,指针题全是送分题。
内存 = 一排编了号的格子,每个格子 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 位环境),和它指向什么类型无关——因为指针存的是地址,地址的长度是固定的。
官方大纲把指针拆成三个动作,我们就按这三个动作教。
int *p; // p 是一个指针,它将来要指向一个 int
char *q; // q 是一个指针,它将来要指向一个 char
double *r; // 同理
读法:从右往左读。 int *p 读作”p 是一个指针,指向 int”。
⚠️ 星号的位置陷阱:
int *a, b; // a 是指针,b 是【普通 int】! int *a, *b; // 这样两个才都是指针星号是跟着变量走的,不是跟着类型走的。这是判断题的常客。
int x = 10;
int *p = &x; // 把 x 的地址装进 p,此时说"p 指向 x"
x p
┌──────┐ ┌────────┐
│ 10 │ ←───── │ 0x1000 │
└──────┘ └────────┘
地址 0x1000 p 里装的是 x 的地址