根据到目前为止的经验,二维数组和线性一维数组都存储在内存中。现在我的问题是,我已经声明了一个二维数组(5 * 5),对其进行了初始化,现在我想访问索引(3,4)。我将只写arr [3] [4],但OS如何实际访问元素。操作系统将如何得知从第二行,第三行等开始的索引是什么?
答案 0 :(得分:2)
操作系统与此无关。就OS而言,该进程正在访问其自身的变量之一。操作系统并不关心进程如何使用自己的内存。 (好的,操作系统可能会收到通知,需要分配内存页面或从缓存中检索内存页面,但这完全不同。)
您可能是说编译器如何生成代码以访问数组元素。
假设我们说的是C语言程序,声明是
long arr[5][5];
然后编译器将编译
arr[i][j]
插入* (* (arr + i) + j)
,在机器代码中解析为
LOAD
地址arr
进入寄存器
ADD
i 乘以行大小(在我们的示例中,i
乘以5倍sizeof(long)
)
ADD
j 乘以元素大小
现在寄存器中保存着arr[i][j]
的地址。
对于所问的问题,编译器如何寻址arr[3][4]
,答案是所有这些计算都是在编译时完成的(因为索引是常量),并且访问与访问任何简单变量。
多维数组不仅作为单维数组存储。它们确实是 一维数组,至少在诸如C之类的语言中。您的示例arr[5][5]
是一个包含5个元素的数组(声明中的第一个5
)。数组的每个 都是5个元素的数组(声明中的第二个5
)。