a[6]={1,2,3,4,5,6};
的内存布局
1 2 3 4 5 6
addr 2002 2006 2010 2014 2016 2020
b[2][3]={1,2,3,4,5,6};
b
的内存布局 1 2 3 4 5 6
addr 2002 2006 2010 2014 2016 2020
a和b都相同
为什么a[1]
地址为2006
且b[1]
地址为2010
两者都不同。数组是连续存储的,为什么它们不同。所以我怀疑数组中braket[][]
是什么,我们知道内存包括地址而不是列和行。
答案 0 :(得分:3)
答案在于结果的类型。几乎每当在C中提到数组时,它就会衰减成指向其第一个元素的指针。现在针对你的两个案例:
a的类型是int ()[6]
,它在执行int*
隐含的指针算法之前衰减为指向int a[1]
的指针。表达式a[1]
恰好等同于*(a + 1)
。这个指针的添加会使指针前进一int
,因为这就是指针指向的位置。
b的类型是int ()[2][3]
,它衰变为指向数组int (*)[3]
的指针。指针指向的数组大小为三个整数。因此,*(b + 1)
将指针前进三个整数。
答案 1 :(得分:1)
对于第二个数组,内存布局实际上是
+---------+---------+---------+---------+---------+---------+ | b[0][0] | b[0][1] | b[0][2] | b[1][0] | b[1][1] | b[1][2] | +---------+---------+---------+---------+---------+---------+
答案 2 :(得分:0)
让我们一劳永逸地明确这一点:
首先,让我们假设a
和b
都映射到完全相同的内存区域。也就是说,a[0]
和b[0][0]
都存储在从相同地址开始的连续内存位置。
考虑到这一点,请注意a[1]
和b[1]
不相同的内存位置。为什么?因为a
是一个整数数组,b
是一个整数数组的数组。 b
中的每个位置都是3个整数的数组; a
中的每个位置都是整数。
因此,a[1]
与b[1]
的内存地址不同,因为b[1]
距离3*sizeof(b[0][0])
b[0][0]
个字节,a[1]
与sizeof(a[0])
相距a[0]
个字节。因此,偏移是不同的,即使数组布局在内存中是相同的。您对a[1]
和b[1]
的困惑与指数相同,但意味着不同的事实有关。
a[1]
相当于*(a+1)
,而b[1]
相当于*(b+1)
。问题是,a+1
和b+1
按比例分摊1 (再次分别按sizeof(a[0])
和3*sizeof(b[0][0])
)。这就是地址不同的原因。
特别是,&b[1]
与&a[3]
相同。