【发布时间】:2018-04-03 21:05:33
【问题描述】:
有人可以向我解释为什么这段代码有效吗?!!
我知道 A 持有 &A[0],它不是一个真正的指针,就像你 cout
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在这种情况下具有double[5]*类型 -
或者你可以使用 std::vector :-)
-
你是一个普遍误解的受害者,即
&A和&A[0]是相同的东西,而实际上它们不是。 -
@pm100 很遗憾不能对 cmets 投反对票。如果有人无法理解 C++ 中指向数组的指针是如何工作的,那么使用
std::vector不是解决方案。 -
考虑到这里有两位精通评论者声称代码导致了 UB,这确实是一个很好的建议。不过我会换一种说法:找到更清洁的解决方案(例如使用
std::vector或std::array)!但是,知道&A与&A[0]不同是这里最有价值的信息。
标签: c++ arrays pointers pointer-arithmetic