C++ 为什么存储在数组中的地址值与它自己的地址相同,它应该指向不同的地址(&;arr[0])? #包括 使用名称空间std; int main() { int-arr[3]{0,1,2}; cout

C++ 为什么存储在数组中的地址值与它自己的地址相同,它应该指向不同的地址(&;arr[0])? #包括 使用名称空间std; int main() { int-arr[3]{0,1,2}; cout,c++,arrays,pointers,C++,Arrays,Pointers,让我们来分解一下: arr作为指向其第一个元素的指针进行计算。因此它返回数组第一个元素的地址 &arr是“数组的地址”,它的计算结果是它的第一个元素的地址。我想你对这个问题很感兴趣,因为arr本身的计算结果是指向第一个元素的指针,因此它应该是“第一个元素的地址”。但在这种情况下,数组不是第一个计算值ted指向指向第一个元素的指针,它只返回其原样的地址 &arr[0]正在访问arr的第一个元素,然后检索该元素的地址 因此,这三个元素都将返回第一个元素的地址 编辑:需要注意的一点是&arr和&a

让我们来分解一下:

  • arr
    作为指向其第一个元素的指针进行计算。因此它返回数组第一个元素的地址
  • &arr
    是“数组的地址”,它的计算结果是它的第一个元素的地址。我想你对这个问题很感兴趣,因为
    arr
    本身的计算结果是指向第一个元素的指针,因此它应该是“第一个元素的地址”。但在这种情况下,数组不是第一个计算值ted指向指向第一个元素的指针,它只返回其原样的地址

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

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

编辑:需要注意的一点是
&arr
&arr[0]
之间的类型不匹配。前者指的是数组类型,而后者指的是元素类型。对它们进行算术运算将导致截然不同的结果。

我们来分析一下:

  • arr
    作为指向其第一个元素的指针进行计算。因此它返回数组第一个元素的地址
  • &arr
    是“数组的地址”,它的计算结果是它的第一个元素的地址。我想你对这个问题很感兴趣,因为
    arr
    本身的计算结果是指向第一个元素的指针,因此它应该是“第一个元素的地址”。但在这种情况下,数组不是第一个计算值ted指向指向第一个元素的指针,它只返回其原样的地址

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

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


编辑:需要注意的一点是
&arr
&arr[0]之间的类型不匹配
。前者指的是数组类型,而后者指的是元素类型。对它们进行算术运算将导致截然不同的结果。

你刚刚发现了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
是一样的。指向海市蜃楼的指针,是你想象的虚构,也是海市蜃楼,也是你想象的虚构。你刚刚发现了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
是相同的。指向海市蜃楼的指针,是你想象的虚构,也是海市蜃楼,也是你想象的虚构。这三者都返回相同的值,即&arr==arr=&arr[0],意思是&arr[0]位于&arr中,现在arr也是一个指针,因此&arr将有两个值,一个是&arr[0]和arr[0]。这怎么可能?@user10867746'…这意味着
&arr[0]
位于&arr`':不在。@user10867746区别在于,
&arr[0]
获取数组的第一个元素并返回其地址,而
&arr
返回数组本身的地址,该地址与第一个元素的地址相同。此外,
arr
仅在其自身计算时隐式转换为指向第一个元素的指针。当它与
&
运算符,情况并非如此。这三个运算符都返回相同的值,即&arr==arr==&arr[0],这意味着&arr[0]位于&arr中,现在arr也是一个指针,因此&arr将有两个值,一个是&arr[0],另一个是arr[0]。这怎么可能呢?@user10867746'…这意味着
&arr[0]
位于&arr`':不在其中。@user10867746区别在于,
&arr[0]
取数组的第一个元素,返回i
#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