首页 > 解决方案 > *(&arr + 1) - arr 如何提供数组大小

问题描述

int arr[] = { 3, 5, 9, 2, 8, 10, 11 };      
int arrSize = *(&arr + 1) - arr;
std::cout << arrSize;

我无法了解这是如何工作的。所以任何人都可以帮助我。

标签: c++arrays

解决方案


如果我们将数组与指针一起“绘制”,它将如下所示:

+--------+--------+-----+--------+-----+
| arr[0] | arr[1] | ... | arr[6] | ... |
+--------+--------+-----+--------+-----+
^        ^                       ^
|        |                       |
&arr[0]  &arr[1]                 |
|                                |
&arr                             &arr + 1

表达式&arr和的类型&arr + 1int (*)[7]。如果我们取消引用这些指针中的任何一个,我们会得到一个 type 的值int[7],并且与所有数组一样,它将衰减为指向其第一个元素的指针。

所以发生的事情是我们在&arr + 1指向&arr.

所有指针运算都是在指向类型的基本单元中完成的,在这种情况下是int,因此结果是int被指向的两个地址之间的元素数。


知道数组自然会衰减为指向其第一个元素的指针可能很有用,即表达式arr将衰减为&arr[0],其类型为int *

此外,对于任何指针(或数组)p和索引i表达式*(p + i)完全等于。所以实际上是一样的(这使得 UB 更加明显)。p[i]*(&arr + 1)(&arr)[1]


推荐阅读