我有一个4x4矩阵并在其上做一些事情。经过一些测试后,我的印象是第一个坐标会根据第二个坐标值自动递增/递减,即使这似乎是不可能的。为了说清楚,我进行了最基本的测试:打印。
令我惊讶的是,事实证明(第一个)坐标是根据第二个值自动调整的,也就是说,下面的代码在一行中打印所有矩阵的元素,没有任何段错误:
for (int j = 0; j < 16; j++)
printf("%d ", mx[0][j])
我的第一件事就是编译器可能进行的优化,但结果与最基本的设置相同。
请解释发生了什么。
答案 0 :(得分:1)
实际上,在声明(而不是动态内存分配的产品)上定义的C多维数组由内存中的连续行构成。所以,
mx[0]
是mx
数组的基址(仅与mx
相同)。访问内存位置的公式是
row_index * nr_columns + column_index
(您可以很容易地理解为什么两种访问此阵列的方式都相同)。
正如所说的那样,虽然你所做的是未定义的行为,但编译器根本不关心,如果你愿意,可以让你破解。