【问题标题】:How come address value stored in an array is same as its own address, it should be pointing to some different address (&arr[0])?为什么存储在数组中的地址值与其自己的地址相同,它应该指向一些不同的地址(&arr [0])?
【发布时间】:2020-09-18 11:40:53
【问题描述】:
#include<iostream>
using namespace std;
int main()
{
int arr[3]{0,1,2};
cout<<"The value of arr "<<arr<<'\n'; 
cout<<"The address of &arr "<<&arr<<'\n';
cout<<"The address of &arr[0] "<<&arr[0]<<'\n';
cout<<"The value in arr[0] "<<arr[0]<<'\n';
}

OUTPUT

The value of arr 0x7ffd1a658e74
The address of &arr 0x7ffd1a658e74
The address of &arr[0] 0x7ffd1a658e74
The value in arr[0] 0

数组arr中的地址值与&arr相同,因为数组是指向其第一个元素的指针,所以值arr应该是等于 &arr[0] 等于 &arr。那么arr怎么会有两个值:&arr[0]的地址值和arr[0]处的值,因为arr = &arr[0] = &arr

【问题讨论】:

  • 您刚刚发现了 C++ 肮脏的小秘密。所有阵列都是您的想象。或者是一场噩梦(任你选)。他们是海市蜃楼。它们不存在。而且由于它们不存在,它们不可能有一个只属于它们的地址,而不属于其他任何东西,明白吗?
  • @SamVarshavchik 但是根据上述,数组指向自身,arr 和 &arr 是相同的。
  • &amp;arr&amp;arr[0] 的值是相同的,因为数组的第一个元素在arr 的开头占用了一个内存单元。它们的类型不同。尝试计算表达式&amp;arr == &amp;arr[0](例如bool same = (&amp;arr == &amp;arr[0])以打印值,您会发现由于类型不同导致代码无法编译。
  • @Peter 由于 &arr 和 &arr[0] 相等,这意味着 &arr[0] 中的值位于 &arr 中,现在数组也是一个指针,意味着它具有指向其第一个位置的地址值,这意味着 arr 有两个值,一个地址为 &arr[0],其值为 arr[0]。这怎么可能?
  • 是的。 arr&amp;arr 是一样的。一个指向海市蜃楼的指针,一个你想象的虚构,也是一个海市蜃楼,一个你想象的虚构。

标签: c++ arrays pointers


【解决方案1】:

让我们分解一下:

  • arr 被评估为指向其第一个元素的指针。所以它返回数组第一个元素的地址。
  • &amp;arr 是“数组的地址”,它被计算为其第一个元素的地址。我认为您对此感到困惑,因为arr 本身被评估为指向第一个元素的指针,因此它应该是“第一个元素的地址的地址”。但是在这种情况下,数组不会首先被评估为指向第一个元素的指针,它只是按原样返回它的地址。

  • &amp;arr[0] 正在访问arr 的第一个元素,然后检索它的地址。

因此,这三个都将返回第一个元素的地址。

编辑:应该注意的一件事是&amp;arr&amp;arr[0] 之间的类型不匹配。前者将引用数组类型,而后者将引用元素类型。对它们进行算术运算会导致截然不同的结果。

【讨论】:

  • 这三个都返回相同的值,即&arr == arr == &arr[0],也就是说&arr[0]在&arr中,现在arr也是一个指针所以&arr会有两个值为 1 &arr[0] 和 arr[0]。这怎么可能?
  • @user10867746 '... 这意味着 &amp;arr[0] 位于 &arr`':不,它没有。
  • @user10867746 不同之处在于,&amp;arr[0] 获取数组的 第一个元素,并返回其地址,而 &amp;arr 则返回 数组本身,与第一个元素的地址相同。此外,arr 仅在自身评估时隐式转换为指向第一个元素的指针。当它与&amp; 运算符结合使用时,情况并非如此。
猜你喜欢
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2016-02-08
  • 2021-04-01
  • 2022-11-23
相关资源
最近更新 更多