zoukankan      html  css  js  c++  java
  • 数组的寻址

    两种顺序映象的方式

    1. 以行序为主序(低下标优先)

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

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

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

    一维数组寻址公式

    若一维数组的下标下界为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 ]

    例5(附图示):

    数组A[0..5, 0..6]的每个元素占5个字节,将其按列优先次序存储在起始地址为2000的内存单元中,则元素A[4] [4]的地址是 ()。

    1. A[0...5, 0...6] = A[6] [7] ,6行7列

    2. A[4] [4],5行5列

    3. 按列优先次序存储:先把前4列存满 (即4 x 6),再加上最后一列的4个元素,最后乘以元素所占字节加上基址

    [(4 * 6+4)* 5 + 2000 = 2140 ]

    image-20201230222957177

    1. 按行优先次序存储:先把前4行存满 (即4 x 7),再加上最后一行的4个元素,最后乘以元素所占字节加上基址

    [(4 * 7+4)*5 + 2000 = 2160 ]

    image-20201230223033720

    注意

    1. 行序为主方式存储就是按顺序先把一行存储满后再换下一行,列序为主方式存储就是按顺序先把一列存储满后再换下一列。
    2. 若不是N阶方阵 则按 行序 或者 列序 的寻址可能不会相同
    无论你从事什么行业,只要做好两件事就够了:一个是你的专业、一个是你的人品。专业决定了你的存在,人品决定了你的人脉;剩下的就是坚持 !
    作者:小帅同学
    版权声明:转载请注明出处
  • 相关阅读:
    java快速排序代码
    java操作redis实现和mysql数据库的交互
    python 操作mysql数据库存
    JAVA 操作远程mysql数据库实现单表增删改查操作
    URI和URL及URN的区别
    day06_字符集设置
    day6_oracle手工建库
    day08_SGA后半部分
    day08_存储
    day05_sqlloader基础
  • 原文地址:https://www.cnblogs.com/gmengshuai/p/13976038.html
Copyright © 2011-2022 走看看