我不明白数组名称是如何指向数组的指针

时间:2018-02-28 18:58:08

标签: c++ arrays pointers

我正在读一本用c ++编写的书,我正在做一些测试,因为我不理解某些东西,当我尝试打印这三行时,我期待所有的东西都不同。第一个,指针内存中的位置,第二个,指针存储的地址,第三个,指针存储的地址的值。但前两个是相同的:

cout <<&arey <<"\n";
cout <<arey <<"\n";
cout <<*arey <<"\n";

输出:

0x6afee8
0x6afee8
0

有人可以解释为什么我已经读过数组的名称是指向数组的指针,所以如果它是一个指针,它应该有自己的内存地址吗?

2 个答案:

答案 0 :(得分:4)

  

我不明白数组名称是如何指向数组的指针

不是。

  

我已经读过数组的名称是指向数组的指针

无论是谁写的都是骗你的。

数组的名称是数组的名称。

  

有人可以解释原因吗

在某些条件下(例如将其传递给函数),它会自动(并透明地)转换为指向数组第一个元素的指针。这是我们从C继承的一个不幸的事实。

但是数组的名称仍然只是数组的名称。

所以:

arey          An array
&arey         Address of the array
f(&arey)      Passing the address of the array
f(arey)       Still passing the address of the array (ish) - thanks a lot, C!
f(*arey)      Passing the first element's value

现在考虑cout << x实际上是cout.operator<<(x)(即函数调用)并解释了您的输出。

  

如果是指针,它应该有自己的内存地址吗?

如果那么它是一个指针,是的,它会。

答案 1 :(得分:1)

Lightness Races in Orbit答案的附录:

因为这个问题被归类为C ++问题而不是简单的C,所以也可能会引起以下兴趣。

Modern C ++建议使用std::array来支持普通的C-Array。它没有成本,但更舒适(比如在内存和大小中组合位置甚至编译时边界检查)。

另请参阅:std::arrayC++ Core Guidelines - std::array

大多数操作对C-Arrays的使用都是透明的。

此外,我更倾向于使用std::addressof支持&(这也适用于std::array)。

请参阅:std::addressof