跳转至

数组与指针(先不看)

数组名与首元素地址

数组名在大多数表达式中,会转换为指向首元素的指针。

int a[5] = {10, 20, 30, 40, 50};
int *p = a; // 相当于int *p = &a[0];

cout << *p; // 输出10

数组本身,不是指针变量。 a 不能像 p 一样,重新赋成另一个地址。

指针的移动

p 指向首元素时:

写法 对应位置或元素
p + i &a[i]
*(p + i) a[i]
p[i] a[i]
int a[5] = {10, 20, 30, 40, 50};
int *p = a;
p++;

cout << *p; // 指向下一个int元素,输出20

加 1,是走过一个元素,不一定是走过一个字节。 步长与指向的元素类型有关。

两种遍历写法

下面 n 个元素已经存进数组,p 指向首元素。

for (int i = 0; i < n; i++) cout << a[i] << ' ';
for (int i = 0; i < n; i++) cout << *(p + i) << ' ';

这两种写法访问相同的元素,客观题中可能换着出现。

范围与尾后位置

int a[5] = {};
int *p = a + 5; // 可以得到尾后指针

a 的最后一个元素是 a[4],a + 5 在它后面一位,只能作为边界,不能通过 *p 读取元素。

指针加减,只能在同一数组及其尾后位置的范围内进行。不能越过去,再指望走回来就没事。

sizeof 数组,与 sizeof 指针,不是一回事。

int a[5] = {};
int *p = a;

cout << sizeof a; // 整个数组占的字节数
cout << sizeof p; // 指针变量本身占的字节数

不要用 sizeof p 计算 p 指向的数组长度。