为什么我们将 [ ] 与指向数组的指针一起使用?
Why do we use [ ] with pointers that point to arrays?
我是 C++ 的初学者,我很难理解为什么我们使用 [ ] 来处理指向数组的指针。
据我所知new int[5]
returns 一个指向大小为 5 的数组的指针。
所以如果我们要将这个指针存储在一个变量中,我们会这样做:int *arr = new int[5]
.
我不明白的是:如果我想访问该数组的索引 0,我会做 arr[0]
.
为什么这个语法是正确的?因为在我看来 arr
是一个指针,所以我必须取消引用指针才能访问数组。
为什么我们不必取消引用指针?
在我看来我会做类似 (*arr)[0]
的事情,但这是不正确的。
数组下标运算符 []
隐式取消引用指针。
这在 C++17 standard 的第 8.2.1p1 节中有详细说明:
The expression E1[E2]
is identical (by definition) to *((E1)+(E2))
以及 C11 standard 的第 6.5.2.1p2 节:
The definition of the subscript operator []
is that E1[E2]
is identical to (*((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
我是 C++ 的初学者,我很难理解为什么我们使用 [ ] 来处理指向数组的指针。
据我所知new int[5]
returns 一个指向大小为 5 的数组的指针。
所以如果我们要将这个指针存储在一个变量中,我们会这样做:int *arr = new int[5]
.
我不明白的是:如果我想访问该数组的索引 0,我会做 arr[0]
.
为什么这个语法是正确的?因为在我看来 arr
是一个指针,所以我必须取消引用指针才能访问数组。
为什么我们不必取消引用指针?
在我看来我会做类似 (*arr)[0]
的事情,但这是不正确的。
数组下标运算符 []
隐式取消引用指针。
这在 C++17 standard 的第 8.2.1p1 节中有详细说明:
The expression
E1[E2]
is identical (by definition) to*((E1)+(E2))
以及 C11 standard 的第 6.5.2.1p2 节:
The definition of the subscript operator
[]
is thatE1[E2]
is identical to(*((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