有人可以向我解释为什么这段代码有效吗?!!
我知道 A 持有 &A[0] 并且它不是一个真正的指针,就像你 cout<<&A 你会得到 &A[0],但这个结果对我来说看起来很奇怪。
int main()
{
double A[] = {2.4, 1.2, 4.6, 3.04, 5.7};
int len = *(&A+1) - A; // Why is this 5?
cout << "The array has " << len << " elements." << endl;
return 0;
}
为什么这段代码不起作用?你如何让它发挥作用?
void test(double B[])
{
int len = *(&B+1) - B;
cout << len << endl;
}
int main()
{
double A[] = {2.4, 1.2, 4.6, 3.04, 5.7};
test(A);
system("pause");
return 0;
}
最佳答案
表达式解析如下:
(*((&A) + 1)) - A
可能令人烦恼的部分是,对于此表达式的某些(但不是全部!)部分,数组衰减为指向第一个元素的指针。那么,让我们展开这个:
首先是获取数组的地址,它为您提供了一个指向包含五个元素的数组的指针。
然后,指针递增 (
+ 1
),给出紧跟数组的地址。第三,取消对指针的引用,这会产生对包含五个元素的数组的引用。
最后,数组被减去。只有在这里,两个操作数才真正衰减为指向它们第一个元素的指针。两者是数组相隔的长度,给出元素个数作为距离。
关于C++,静态数组,指针,长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49639141/