2016-02-24 53 views
-2

对于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]对不对?为什么两个人都有地址?

+0

为什么'&i [0] [0] == i'是因为数组到指针的衰减。为什么'&i [0] [0] ==&i'是一个实现定义的重合。 – user3528438

回答

1

C++中的数组被命名为内存区域(假定指定了数组的名称)。因此,如果考虑您的示例&i&i[0][0]给出了阵列元素占用的区域的最低(第一个)字节的相同地址。 这些表达式的唯一区别(除了它们的类型)是指向对象的大小。 表达

sizeof(*&i) 

产生整个阵列的同时表达

sizeof(*&i[0][0]) 

大小产生int类型的objedct的大小。

在表达式中,数组指示符被转换为指向其第一个元素的指针。

+0

我会投下这个答案,除非有证据表明'&i ==&i [0] [0]'是明确定义的行为。 – user3528438

+0

@ user3528438我还没有理解您的评论。例如,可以通过将两个指针都转换为void *来编写此条件。 –

+0

即使您将两者都视为void *,我也不认为标准保证它们相等。我假设平等是实现定义的。 – user3528438

相关问题