数组的寻址

数组的顺序存储表示和实现-数组的寻址
两种顺序映象的方式
以行序为主序(低下标优先)

以列序为主序(高下标优先)

可用下标值随机的访问该数组的任意一个元素。

计算数组元素存储地址的公式称为寻址公式。

一维数组寻址公式
若一维数组的下标下界为LB,上界为UB,每个元素占用S个存储单元,第一元素(其下标为LB)的地址为LOC(LB),下标为i的数组元素A[i]的地址为LOC(i),则计算LOC(i)的寻址公式为:

LOC(i)=LOC(LB)+(i−LB)×S
例1:
若一维数组a[5], 每个元素占用4个存储单元,第一元素(其下标为0)的地址为LOC(0) = 1000,下标为3的数组元素a[3]的地址为LOC(3),计算LOC(3)的地址:

LOC(3)=LOC(0)+(3−0)×4=1000+12=1012
二维数组寻址公式
若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从1开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按行优先顺序存放则寻址公式为:

LOC(i,j)=LOC(1,1)+[n×(i−1)+j−1]×S
若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从0开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按行优先顺序存放则寻址公式为:

LOC(i,j)=LOC(0,0)+(n×i+j)×S
若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从1开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按列优先顺序存放则寻址公式为:

LOC(i,j)=LOC(1,1)+[m×(j−1)+i−1]×S
若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从0开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按列优先顺序存放则寻址公式为:

LOC(i,j)=LOC(0,0)+(m×j+i)×S
寻址 = 基址 + 所求位置前面所有元素的个数的地址

例1:
一个二维数组A,行下标的范围是1到6,列下标的范围是0到7,即6行8列,A[1…6] [0…7], 每个数组元素用相邻的6个字节存储,存储器按字节编址。那么,这个数组的体积是 ( ) 个字节。

答:

Volume=m∗n∗L=(6−1+1)∗(7−0+1)∗6=48∗6=288
例2:
设数组a[0…59] [0…69]的基地址为2048,每个元素占2个存储单元,若以行序为主序顺序存储,则元素 a[32,58]的存储地址为 ( ) a[0…59] [0…69] = a[60] [70]

答:

​ 根据行优先公式

LOC(i,j)=LOC(0,0)+(n×i+j)×S
  得:

LOC(32,58)=2048+(32∗70+58)∗2=6644
例3:
二维数组A[10] [20]采用列序为主方式存储,每个元素占1个存储单元,并且A[0] [0]的存储地址是200,

​ 则A[6] [12]的地址是( ) 。A[6] [12]: 第7行第13列

答:

​ 根据行优先公式 (n代表总列数)

LOC(i,j)=LOC(0,0)+(n×i+j)×S
  得:

LOC(6,12)=200+(20∗6+12)∗1=332
​ 根据列优先公式 (m代表总行数)

LOC(i,j)=LOC(0,0)+(m×j+i)×S
  得:

LOC(6,12)=200+(10∗12+6)∗1=326
例4:
二维数组A[10…20] [5…10]采用行序为主方式存储,每个元素占4个存储单元,且A[10] [5]的存储地址是 1000,则A[18] [9]的地址是 ( ) 。

​ 分析:A[10…20] [5…10] 等价于A[0…10] [0…5]等价于A[11] [6], 11行6列,A[18] [9] 等价于A[8] [4]

​ 根据行优先公式 (n代表总列数)

LOC(i,j)=LOC(0,0)+(n×i+j)×S
  得:

LOC(18,9)=LOC(8,4)=1000+(6∗8+4)∗4=1208
注意

行序为主方式存储就是按顺序先把一行存储满后再换下一行,列序为主方式存储就是按顺序先把一列存储满后再换下一列。
若不是N阶方阵 则按 行序 或者 列序 的寻址可能不会相同

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值