c++ - *(&arr + 1) - arr 如何提供数组大小
问题描述
int arr[] = { 3, 5, 9, 2, 8, 10, 11 };
int arrSize = *(&arr + 1) - arr;
std::cout << arrSize;
我无法了解这是如何工作的。所以任何人都可以帮助我。
解决方案
如果我们将数组与指针一起“绘制”,它将如下所示:
+--------+--------+-----+--------+-----+
| arr[0] | arr[1] | ... | arr[6] | ... |
+--------+--------+-----+--------+-----+
^ ^ ^
| | |
&arr[0] &arr[1] |
| |
&arr &arr + 1
表达式&arr
和的类型&arr + 1
是int (*)[7]
。如果我们取消引用这些指针中的任何一个,我们会得到一个 type 的值int[7]
,并且与所有数组一样,它将衰减为指向其第一个元素的指针。
所以发生的事情是我们在&arr + 1
指向&arr
.
所有指针运算都是在指向类型的基本单元中完成的,在这种情况下是int
,因此结果是int
被指向的两个地址之间的元素数。
知道数组自然会衰减为指向其第一个元素的指针可能很有用,即表达式arr
将衰减为&arr[0]
,其类型为int *
。
此外,对于任何指针(或数组)p
和索引,i
表达式*(p + i)
完全等于。所以实际上是一样的(这使得 UB 更加明显)。p[i]
*(&arr + 1)
(&arr)[1]
推荐阅读
- javascript - 在codeigniter中从ajax解析数组多维到控制器?
- android - 适用于 Android API 16 的 Glide 和 OkHttp 无法正常工作
- docker - 无法使用 docker 启动 kurento 媒体服务器
- php - 客户访问 Superglobals
- javascript - 仅在 Firefox 中滚动时具有固定位置凸起的元素
- doctrine-orm - Symfony4 存储在具有关系的会话实体中
- git - 是否有必要从我们的 CI 管道提交 DVC 文件?
- vue.js - Vue CLI 从项目模块动态导入
- c# - 在 C# 中使用 Google OR-Tools 寻找目标?
- sql - while循环完成时变量值丢失