相关疑难解决方法(0)

*(&arr + 1) - arr 如何给出数组 arr 元素的长度?

#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

c++ arrays

8
推荐指数
1
解决办法
1475
查看次数

强制数组衰减(因为没有更好的标题)

受到这个问题的启发:*(&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从它看起来似乎有试图使间接本身合法化,但我没有能够在实际标准中找到任何与此相关的措辞。

c++ language-lawyer

5
推荐指数
1
解决办法
198
查看次数

标签 统计

c++ ×2

arrays ×1

language-lawyer ×1