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

问题描述 投票:0回答:1

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

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

因此,如果我们将此指针存储在变量中,我们将执行:int *arr = new int[5]

我不理解的是:如果我要访问该数组的索引0,我会执行arr[0]

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

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

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

c++ arrays pointers new-operator
1个回答
2
投票
这在C++17 standard的8.2.1p1节中有详细说明:

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

以及C11 standard的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
© www.soinside.com 2019 - 2024. All rights reserved.