我不明白数组名称是如何指向数组[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

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

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

输出:

0x6afee8
0x6afee8
0

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

c++ arrays pointers
2个回答
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
投票

Lightness Races in Orbit答案的附录:

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

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

另见:std::arrayC++ Core Guidelines - std::array

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

此外,它更喜欢使用std::addressof而不是&(这也适用于std::array)。

见:std::addressof

© www.soinside.com 2019 - 2024. All rights reserved.