【发布时间】: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 是相同的。
-
&arr和&arr[0]的值是相同的,因为数组的第一个元素在arr的开头占用了一个内存单元。它们的类型不同。尝试计算表达式&arr == &arr[0](例如bool same = (&arr == &arr[0])以打印值,您会发现由于类型不同导致代码无法编译。 -
@Peter 由于 &arr 和 &arr[0] 相等,这意味着 &arr[0] 中的值位于 &arr 中,现在数组也是一个指针,意味着它具有指向其第一个位置的地址值,这意味着 arr 有两个值,一个地址为 &arr[0],其值为 arr[0]。这怎么可能?
-
是的。
arr和&arr是一样的。一个指向海市蜃楼的指针,一个你想象的虚构,也是一个海市蜃楼,一个你想象的虚构。