【发布时间】:2020-04-15 20:12:19
【问题描述】:
#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;
}
对于上面的代码,我不太明白这两段代码是干什么的:
*(&arr + 1)
和
*(&arr)
&arr
谁能解释一下?因为当我运行以下两个代码时,我得到以下相同的输出:
&arr(我觉得这个指向arr第一个元素的地址)
*(&arr)那我不太明白这是做什么的,符号*对&arr有什么作用(即到这里的地址)?,因为我运行它们时两个输出是一样的
最后,当通过以下代码将整数 1 添加到地址时,到底发生了什么:
&arr + 1
【问题讨论】:
-
*(&arr + 1)调用未定义的行为。这段代码不计算数组的长度,只是坏掉了 -
但这怎么给出长度:*(&arr + 1) - arr
-
未定义的行为意味着任何事情都可能发生。包括意外的结果。虽然这可能只是在您的计算机和编译器上
-
请尽快忘记这个技巧。请改用规范的
sizeof(arr)/sizeof(*arr)。 -
@TedLyngmo 是的,这在 C++ 中甚至更好。不过,
sizeof方法适用于 C 和 C++。