#include <iostream>
using namespace std;
int main() {
int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "The length of the array is: " << len;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于上面的代码,我不太明白这两段代码是做什么的:
*(&arr + 1)
Run Code Online (Sandbox Code Playgroud)
和
*(&arr)
&arr
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?因为当我运行以下两个代码时,我得到以下相同的输出:
&arr (我认为这指向arr的第一个元素的地址)
*(&arr)那么我不太明白这是做什么的,符号*对&arr(即这里的地址)有什么作用?,因为当我运行它们时,两个输出是相同的
最后,当一个整数说 1 被这里的代码添加到地址时,到底发生了什么:
&arr + 1
受到这个问题的启发:*(&arr + 1) - arr 如何给出数组 arr 元素的长度?
以下代码将计算数组的长度,尽管调用了未定义的行为:
int arr[] = {5, 8, 1, 3, 6};
size_t len = *(&arr + 1) - &arr[0]; // len is 5
Run Code Online (Sandbox Code Playgroud)
我相信,通过取消引用 (&arr + 1) 我们正在触发未定义的行为。但是,我们这样做的唯一原因是立即将结果衰减为int*,指向原始数组中最后一个元素之后的一个元素。由于我们没有取消引用这个指针,我们在定义的区域中很好。
因此,问题如下:是否有一种方法可以在int*不取消引用不可引用指针并保持定义的情况下衰减?
PS 强制免责声明:是的,我可以使用sizeof运算符和除法计算数组的大小。这不是问题的重点。
编辑: 我现在不太确定间接本身是未定义的。我发现http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232从它看起来似乎有试图使间接本身合法化,但我没有能够在实际标准中找到任何与此相关的措辞。