为什么我们将 [ ] 与指向数组的指针一起使用?
Why do we use [ ] with pointers that point to arrays?
我是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
相关文章:
- 在将 new 与指针一起使用时,创建数组的指定长度
- 为什么我们将 [ ] 与指向数组的指针一起使用?
- 如何将数组与指针一起使用?
- 如何将 string.erase() 与指针一起使用?
- __unaligned说明符何时与指针一起使用?
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 自动关键字与智能指针一起
- shared_ptr ::重置仅与原始指针一起使用
- 为什么动态演员只能与参考和指针一起使用
- 是否可以将SDL2与智能指针一起使用
- 如何将此指针与指向成员函数的指针一起使用
- 将shared_ptr与指向指针的指针一起使用时出现编译器错误
- 将 std::sort 与指向整数变量的指针一起使用会产生意外的输出
- QtConcurrent::run 是否可以与指向对象的智能指针一起使用
- 重新分配指针后,将类功能与指针一起使用
- 将共享指针的别名构造函数与空共享指针一起使用C++
- 如何将转换构造函数与指针一起使用?
- 如何 RAII 与指针一起使用
- Vtables是否仅与指向基类的指针一起使用
- 将 decltype 与虚拟成员函数指针一起使用