我正在尝试理解一些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
思想?
答案 0 :(得分:4)
根据标准数组元素在内存中是连续的(这是数组的主要属性)。因此,任何数组,无论它的维度在内存中具有相同的表示,使用多重索引 - 都是语法糖。
答案 1 :(得分:2)
C以行主要顺序存储数组,首先是行0
,然后是行1
,依此类推。此图像可以帮助您以更清晰的方式理解它
答案 2 :(得分:1)
为什么通过1维反向访问数组来打印数组 存储值打印的值的顺序?
因为它们存储在连续的内存中。
如果数组被声明为[2] [3]数组,是否可以 当只宣布3个时引用第4行?
如果您这样做,则尝试访问越界元素。
这似乎反向打印存储在内存中的值 -
因为它是如何存储在堆栈!
中的有关详细信息,请参阅此图片
答案 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
这与数组无关。