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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我不明白数组名称是如何指向数组[重复]相关的知识,希望对你有一定的参考价值。

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

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

cout <<&arey <<"
";
cout <<arey <<"
";
cout <<*arey <<"
";

输出:

0x6afee8
0x6afee8
0

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

答案

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

事实并非如此。

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

谁写的那个骗你。

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

有人可以解释原因

在某些条件下(例如将其传递给函数),它会自动(并透明地)转换为指向数组第一个元素的指针。这是我们从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)(即一个函数调用),它解释了你的输出。

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

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

另一答案

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

以上是关于我不明白数组名称是如何指向数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我不明白如何递归地编写函数

我不明白我的数组有啥问题

迭代对象数组时返回 false 或 true [重复]

反应挂钩以根据先前的状态值更新状态[重复]

如何使列表视图出现在片段中?

如何遍历这种数组并获取每个元素的标签或名称[重复]