c++ - 为什么我们将 [ ] 与指向数组的指针一起使用?
问题描述
我是 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
推荐阅读
- javascript - primeng 列过滤器不适用于 Promise Values
- node.js - MongoDB:TypeError:无法读取 101 个文档后未定义的属性“getMore”
- ruby-on-rails - Rails 6为每个类别选择随机ActiveRecord对象
- c++ - 手动从类对象向量中排序数据 - C++
- python - 质疑这样的 Python 类是否正确
- reactjs - react + jest - 在测试子句中模拟子组件不会模拟组件
- firebase - 为什么我无法将我的 Google Firebase 计划从 spark 升级到 blaze?
- php - Wordpress sql查询结果与phpmyadmin中的sql查询查询不同的顺序
- node.js - 如何在身份验证中检查令牌
- api - 使用 IAsyncEnumerable
作为 ASP.NET Web API 中的 API 输出