C++,静态数组,指针,长度

C++, static array, pointer, length

有人可以向我解释为什么这段代码有效吗?!!

我知道 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. 首先是获取数组的地址,它为您提供指向包含五个元素的数组的指针。

  2. 然后,指针递增(+ 1),给出紧跟数组的地址。

  3. 第三,指针被取消引用,它产生对五个元素的数组的引用。

  4. 最后,数组相减。只有在这里,两个操作数才真正衰减为指向它们第一个元素的指针。两者是数组相隔的长度,给出元素个数作为距离。

&A 获取 A 本身的地址。 A 的类型是 double[5].

当您获取 A 本身的地址并将该指针递增 1 时,您将其递增 sizeof(double[5]) 字节。所以现在你有一个指向 A 数组后地址的指针。

当您取消引用该指针时,您将引用 A 之后的下一个 double[5] 数组,这实际上也是指向 [=21= 地址的 double* 指针].

然后您减去 A[0] 的地址(数组衰减为指向其第一个元素的指针),标准指针算法为您提供 5 个元素:

&A[5] - &A[0] = 5