如何使用1维访问C中的2D数组

时间:2014-03-17 12:41:45

标签: c arrays

我正在尝试理解一些C代码,但我无法解决以下问题 -

为什么打印数组时通过1维反转打印存储值的值的顺序?

如果数组被声明为[3] [4]数组,是否可以引用数组[3] [x]的值?

作者初始化了一个二维数组 - 单词[3] [4],基于我的理解,在内存中创建了一个3行/ 4列数组 -

         Col 0   Col 1   Col 2   Col 3
Row 0   [0][0]  [0][1]  [0][2]  [0][3]
Row 1   [1][0]  [1][1]  [1][2]  [1][3]
Row 2   [2][0]  [2][1]  [2][2]  [2][3]

稍后,将值写入硬编码行的数组并根据循环控制可更改列更改z,从0-3开始 -

word[0][z]
word[1][z]
word[2][z]
word[3][z]

最后,通过引用一个维度显示数组 -

printf("%x", *((unsigned int *)word[i]));

这似乎反向打印存储在内存中的值 -

75757575
42424242
48484849

即使它们被保存在内存中,如下所示 -

0xbfa33050: 75757575
0xbfa33054: 42424242
0xbfa33058: 49484848

思想?

4 个答案:

答案 0 :(得分:4)

根据标准数组元素在内存中是连续的(这是数组的主要属性)。因此,任何数组,无论它的维度在内存中具有相同的表示,使用多重索引 - 都是语法糖。

答案 1 :(得分:2)

C以行主要顺序存储数组,首先是行0,然后是行1,依此类推。此图像可以帮助您以更清晰的方式理解它

enter image description here

答案 2 :(得分:1)

  

为什么通过1维反向访问数组来打印数组   存储值打印的值的顺序?

因为它们存储在连续的内存中。

  

如果数组被声明为[2] [3]数组,是否可以   当只宣布3个时引用第4行?

如果您这样做,则尝试访问越界元素

  

这似乎反向打印存储在内存中的值 -

因为它是如何存储在堆栈

中的

有关详细信息,请参阅此图片

enter image description here

答案 3 :(得分:1)

我担心你会混淆两个不同的问题:数组下标和字节序。

拿代码

int a[2][3] = { 0,1,2,3,4,5,6 };

a [x] [y]的值是[x * 3 + y]的值。

a [1] [2]的值是[5] = 5的值。[假设我没有犯任何错误!]

内存中顺序的明显逆转是因为英特尔处理器是小端,因此它将数字的小端(低字节)放在第一位。内存布局如下所示:

00000000
01000000
02000000
03000000
etc

这与数组无关。