对于int i[2][3]
,我在做cout<<&i[0][0]
和cout<<&i
时得到相同的值。为什么数组变量地址和第一个元素地址相等?
而i[0][0]
是第一个元素的值,&i[0][0]
是第一个元素的地址。 i
是一个指针,因此不同于i[0][0]
,它是int
。它存储地址i[0][0]
。所以i
必须存储在不同的位置i[0][0]
对不对?为什么两个人都有地址?
对于int i[2][3]
,我在做cout<<&i[0][0]
和cout<<&i
时得到相同的值。为什么数组变量地址和第一个元素地址相等?
而i[0][0]
是第一个元素的值,&i[0][0]
是第一个元素的地址。 i
是一个指针,因此不同于i[0][0]
,它是int
。它存储地址i[0][0]
。所以i
必须存储在不同的位置i[0][0]
对不对?为什么两个人都有地址?
C++中的数组被命名为内存区域(假定指定了数组的名称)。因此,如果考虑您的示例&i
和&i[0][0]
给出了阵列元素占用的区域的最低(第一个)字节的相同地址。 这些表达式的唯一区别(除了它们的类型)是指向对象的大小。 表达
sizeof(*&i)
产生整个阵列的同时表达
sizeof(*&i[0][0])
大小产生int类型的objedct的大小。
在表达式中,数组指示符被转换为指向其第一个元素的指针。
我会投下这个答案,除非有证据表明'&i ==&i [0] [0]'是明确定义的行为。 – user3528438
@ user3528438我还没有理解您的评论。例如,可以通过将两个指针都转换为void *来编写此条件。 –
即使您将两者都视为void *,我也不认为标准保证它们相等。我假设平等是实现定义的。 – user3528438
为什么'&i [0] [0] == i'是因为数组到指针的衰减。为什么'&i [0] [0] ==&i'是一个实现定义的重合。 – user3528438