?51.2多维数组在计算机内的存放 怎样将多维数组中元素存入到计算机内存中呢?由于 计算机内存结构是一维的(线性的),因此,用一维 内存存放多维数组就必须按某种次序将数组元素排成 个线性序列,然后将这个线性序列顺序存放在存储 器中 52多维数组的存储结构 由于数组一般不作插入或删除操作,也就是说,一旦建 立了数组,则结构中的数组元素个数和元素之间的关系 就不再发生变动,即它们的逻辑结构就固定下来了,不 再发生变化。因此,采用顺序存储结构表示数组是顺理 成章的事了。本章中,仅重点讨论二维数组的存储,三 维及三维以上的数组可以作类似分析
5.1.2 多维数组在计算机内的存放 怎样将多维数组中元素存入到计算机内存中呢?由于 计算机内存结构是一维的(线性的),因此,用一维 内存存放多维数组就必须按某种次序将数组元素排成 一个线性序列,然后将这个线性序列顺序存放在存储 器中 5.2多维数组的存储结构 由于数组一般不作插入或删除操作,也就是说,一旦建 立了数组,则结构中的数组元素个数和元素之间的关系 就不再发生变动,即它们的逻辑结构就固定下来了,不 再发生变化。因此,采用顺序存储结构表示数组是顺理 成章的事了。本章中,仅重点讨论二维数组的存储,三 维及三维以上的数组可以作类似分析
它:?多维数组的顺序存储有两种形式 521行优先顺序 y1.存放规则 行优先顺序也称为低下标优先或左边下标优先于右边下 标。具体实现时,按行号从小到大的顺序,先将第一行 中元素全部存放好,再存放第二行元素,第三行元素, 入依次类推 在 BASIC语言、 PASCAL语言、C/C++语言等高级语言 程序设计中,都是按行优先顺序存放的。例如,对刚才 的Anxn二维数组,可用如下形式存放到内存:a0, 0n-1 an, a a1 m a 。即二维数组按行优先存放到内存后,变成了 个线性序列(线性表)
多维数组的顺序存储有两种形式: 5.2.1 行优先顺序 1.存放规则 行优先顺序也称为低下标优先或左边下标优先于右边下 标。具体实现时,按行号从小到大的顺序,先将第一行 中元素全部存放好,再存放第二行元素,第三行元素, 依次类推 …… 在BASIC语言、 PASCAL语言、 C/C++语言等高级语言 程序设计中,都是按行优先顺序存放的。例如,对刚才 的Am×n二维数组,可用如下形式存放到内存:a00, a01, … a0n-1,a10,a11,..., a1 n-1,…,am-1 0 , am-1 1,…, am-1 n-1。即二维数组按行优先存放到内存后,变成了一 个线性序列(线性表)
飞它?因此,可以得出多维数组按行优先存放到内存的规律: 最左边下标变化最慢,最右边下标变化最快,右边下 标变化一遍,与之相邻的左边下标才变化一次。因此 在算法中,最左边下标可以看成是外循环,最右边下 2.地址计算 由于多维数组在内存中排列成一个线性序列,因此,若 知道第一个元素的内存地址,如何求得其它元素的内存 入地址?我们可以将它们的地址排列看成是一个等差数列, 假设每个元素占1个字节,元素a的存储地址应为第一个 元素的地址加上排在a:前面的元素所占用的单元数,而 a1的前面有行(0~i-1)共×n个元素,而本行前面又有个 元素,故a1的前面一共有×n+个元素,设a0内存地 址为LOCa0),则a1的内存地址按等差数列计算为 LOCa)LOC(a0+(i×时+j)×1。同理,三维数组 A m×n×p 按行优先存放的地址计算公式为: LOC(a1k)=LOC(a00(×n×p+×p+k)×1
因此,可以得出多维数组按行优先存放到内存的规律: 最左边下标变化最慢,最右边下标变化最快,右边下 标变化一遍,与之相邻的左边下标才变化一次。因此, 在算法中,最左边下标可以看成是外循环,最右边下 标可以看成是最内循环。 2.地址计算 由于多维数组在内存中排列成一个线性序列,因此,若 知道第一个元素的内存地址,如何求得其它元素的内存 地址?我们可以将它们的地址排列看成是一个等差数列, 假设每个元素占l个字节,元素aij 的存储地址应为第一个 元素的地址加上排在aij 前面的元素所占用的单元数,而 aij 的前面有i行(0~i-1)共i×n个元素,而本行前面又有j个 元素,故aij的前面一共有i×n+j个元素,设a00的内存地 址为LOC(a00) ,则aij的内存地址按等差数列计算为 LOC(aij)=LOC(a00)+ ( i×n+j ) ×l 。同 理 ,三维数组 Am×n×p 按 行 优 先 存 放 的 地 址 计 算 公 式 为 : LOC(aijk)=LOC(a000)+(i×n×p+j×p+k)×l
gx522列优先顺序 1每则 列优先顺序也称为高下标优先或右边下标优先于左边下 标。具体实现时,按列号从小到大的顺序,先将第一列 中元素全部存放好,再存放第二列元素,第三列元素, 依次类推 在 FORTRAN语言程序设计中,数组是按列优先顺序存 放的。例如,对前面提到的Anx二维数组,可以按如下 的形式存放到内存:a0,a10…,an10,a,a1,…, 0 m a 即二维数组按列 m 优先存放到内存后,也变成了一个线性序列(线性表)
5.2.2 列优先顺序 1.存放规则 列优先顺序也称为高下标优先或右边下标优先于左边下 标。具体实现时,按列号从小到大的顺序,先将第一列 中元素全部存放好,再存放第二列元素,第三列元素, 依次类推 …… 在FORTRAN语言程序设计中,数组是按列优先顺序存 放的。例如,对前面提到的Am×n二维数组,可以按如下 的形式存放到内存:a00, a10…, am-10, a01,a11, …, am-1 1,…, a0 m-1,a1m-1,..., am-1 n-1。 即二维数组按列 优先存放到内存后,也变成了一个线性序列(线性表)
因此,可以得出多维数组按列优先存放到内存的规律: 最右边下标变化最慢,最左边下标变化最快,左边下 标变化一遍,与之相邻的右边下标才变化一次。因此 在算法中,最右边下标可以看成是外循环,最左边下 标可以看成是最内循环 2.地址计算 同样与行优先存放类似,若知道第一个元素的内存地址, 则同样可以求得按列优存放的某一元素a-的地址 对二维数组有:DOC(a1)=LOC(a00×m+i)× 对 维 数 组 有 OC(ak)=LOC(a0o)(k×m×n+j×m+i)x1
因此,可以得出多维数组按列优先存放到内存的规律: 最右边下标变化最慢,最左边下标变化最快,左边下 标变化一遍,与之相邻的右边下标才变化一次。因此, 在算法中,最右边下标可以看成是外循环,最左边下 标可以看成是最内循环。 2.地址计算 同样与行优先存放类似,若知道第一个元素的内存地址, 则同样可以求得按列优存放的某一元素aij的地址。 对二维数组有:LOC(aij)=LOC(a00)+(j×m+i)×l 对三维数组有: LOC(aijk)=LOC(a000)+(k×m×n+j×m+i)×l