为什么我们将 [ ] 与指向数组的指针一起使用?

Why do we use [ ] with pointers that point to arrays?

本文关键字:指针 一起 数组 我们将 为什么      更新时间:2023-10-16

我是C++初学者,我很难理解为什么我们使用 [ ] 处理指向数组的指针。

据我所知,new int[5]返回一个指向大小为 5 的数组的指针。

因此,如果我们要将此指针存储在一个变量中,我们会这样做:int *arr = new int[5].

我不明白的是:如果我想访问该数组的索引 0,我会做arr[0].

为什么这种语法是正确的?因为在我看来arr是一个指针,所以我必须取消引用指针才能访问数组。

为什么我们不必取消引用指针?

在我看来,我会做类似(*arr)[0]的事情,但这是不正确的。

数组下标运算符[]隐式取消引用指针。

这在 C++17 标准的第 8.2.1p1 节中有详细说明:

表达式E1[E2]*((E1)+(E2))相同(根据定义(

以及C11标准的6.5.2.1p2节:

下标运算符[]的定义是E1[E2](*((E1)+(E2)))相同

所以给定你的例子,arr[0]*(arr + 0)完全相同。 括号之间的值将添加到指针值以指向所需的数组元素,并且取消引用生成的指针以获取对象。

此外,说您的示例指向数组并不完全正确,而是指向数组的第一个元素。 指向数组的指针如下所示:

int arr[5];
int (*p)[5] = &arr;

另一件可能令人困惑的事情是,在大多数情况下,数组衰减到指向其第一个元素的指针。 这意味着您可以执行以下操作:

int arr[5];
int *p = arr;
arr[1] = 5;    // sets element 1 of arr
p[1] = 7;      // also sets element 1 of arr