为什么二维不等于一维

时间:2014-02-22 19:08:04

标签: c arrays

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]地址为2006b[1]地址为2010两者都不同。数组是连续存储的,为什么它们不同。所以我怀疑数组中braket[][]是什么,我们知道内存包括地址而不是列和行。

3 个答案:

答案 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)

让我们一劳永逸地明确这一点:

首先,让我们假设ab都映射到完全相同的内存区域。也就是说,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+1b+1 按比例分摊1 (再次分别按sizeof(a[0])3*sizeof(b[0][0]))。这就是地址不同的原因。

特别是,&b[1]&a[3]相同。