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

时间:2018-04-03 21:05:34

标签: c++ arrays pointers pointer-arithmetic

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

我知道A保持&amp; A [0]并且它不是一个真正的指针,好像你想要&lt;&lt;&amp; A你会得到&amp; A [0],但这个结果对我来说看起来很奇怪。< / p>

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;
} 

2 个答案:

答案 0 :(得分:6)

表达式解析如下:

(*((&A) + 1)) - A

可能令人烦恼的部分是,对于此表达式的某些(但不是全部!)部分,数组会衰减到指向第一个元素的指针。所以,让我们解开这个:

  1. 首先是获取数组的地址,它给出了一个指向五个元素数组的指针。

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

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

  4. 最后,减去数组。只有在这里,两个操作数才会实际衰减为指向其第一个元素的指针。这两个是数组分开的长度,它给出了元素的数量作为距离。

答案 1 :(得分:4)

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

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

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

然后你减去A[0]的地址(一个数组衰减成指向它的第一个元素的指针),标准指针算术给你5个元素:

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