首页 > 试题广场 >

有一个二维数组a[1...100 , 1...65]有100

[填空题]
有一个二维数组a[1...100 , 1...65]有100行,65列,我们以行序为主序,如果该数组的基地址是10000,且每个元素占2个存储单元,请问a[56 , 22]的存储地址是1注意是下标是从1开始的
推荐
10000 + ((56 - 1) * 65 -1 + 22) * 2 = 17192
编辑于 2015-04-23 17:09:14 回复(16)
10000 + ((56 - 1) * 65  + 21) * 2 = 17192    题目说的是 a[56 , 22]的存储地址,所以算出a[1,1]到 a[56 , 21]所占内存大小即可。
发表于 2015-08-22 21:54:12 回复(1)
这类题目分为两类:行优先和列优先(假设数组为A[n][m],数组下标从1开始)
1、行优先:基址+((行数-1)*m+列数-1)×每个元素所占内存单位,即10000+((56-1)×65+22-1)×2=17192
2、列优先:基址+((列数-1 )*m+行数-1)×每个元素所占内存单位
发表于 2016-07-01 08:15:04 回复(1)

看到很多人都在纠结下标从1开始,为什么还要减一?这里可以举一个简单的例子:存在3行3列的数组A,从基地址10000开始,对于2行3列的存储地址为10010 = 10000+(6-1)×2,而A[2][3]是第6个元素。所以针对本题a[56][22]为第3597个元素,其地址为10000+(3597-1)*2=17192。

10000 10002 10004

10006 10008 10010

10012 10014 10016

发表于 2017-04-18 15:46:24 回复(0)
以行为主序,故按行算
基址为10000(即第一行第一个为10000),第一行剩下64个;接下来的第二~第五十五行,每行65个,第五十六行,有22个。由于每个元素占2个存储单元,故【56,22】存储地址如下:
10000+(64+65*54+22)*2=17192
编辑于 2018-09-20 16:40:00 回复(0)
注意是下标是从1开始的,所以是10000 + (65 * (56 - 1) + 22 ) * 2
发表于 2015-03-01 14:26:45 回复(0)
如果下标是从0开始,那么M行N列的矩阵,A[i][j]的起始地址为:起始地址 +(i*N+J)* 每个元素所占字节数
如果下标是从1开始,那么M行N列的矩阵,A[i][j]的起始地址为:起始地址 + ((i-1)*N+J-1)*每个元素所占字节数
为什么下标从0算起不需要减1呢,假若3x3的矩阵:
  1. 下标从0算起,A[1][1]前面只有A[0][0],A[0][1],A[0][2]组成的1行元素,数量恰好等于A[1][1]所在的行号;A[1][1]所在的行前面也只有A[1][0]的1个元素,数量恰好等于A[1][1]所在的列号。
  2. 同上,A[2][2]前面只有2行元素,数量恰好等于A[2][2]所在的行号,A[2][2]所在的行前面也只有下标为A[2][0],A[2][1]两个元素,数量恰好等于A[2][2]所在的列号。
  3. 同上,A[i][j]前面有i行元素,第i行前面有j个元素
综上,
可以得出下标为0的A[i][j]地址算法:起始地址 +(i*N+J)* 每个元素所占字节数
下标从1算起,A[i][j]前面存在 i-1 行元素,第i行前面有 j-1 个元素,所以
可以得出下标为1的A[i][j]地址的算法:A[i][j] 起始地址 +(i*N+J)* 每个元素所占字节数
不难看出,计算A[i][j]的地址,其实质就是计算A[i][j]前面总共多少个元素的问题,A[i][j]的地址  起始地址+A[i][j]前面元素所占的字节数
经过上面的推导,希望能帮助大家不在犯迷糊~

发表于 2017-07-03 21:11:48 回复(0)
17192
发表于 2015-04-11 22:54:12 回复(0)
17192
发表于 2014-10-18 14:43:41 回复(2)
考内存模型,无论数组几维,始终是线性内存空间,(55*65+21)*2+10000+2=17194
编辑于 2015-04-23 17:07:02 回复(9)
10000 + ((56 - 1) * 65 + 21) * 2 = 17192
发表于 2021-10-04 15:02:22 回复(0)
第一个元素占据了10000到10001,第二个元素占据10002到10003,所有存储地址是偶数。9999+(56-1)*65*2+(22-1)*2+1
发表于 2018-09-19 10:17:37 回复(0)
10000 + ((56 - 1) * 65  + 22 - 1 ) * 2 = 17192
就是前56-1行加上56行部分列*2+10000
发表于 2018-09-11 18:51:38 回复(0)
看好最后一句,下标从1开始。
编辑于 2018-04-16 00:24:22 回复(0)
10000+(55*65+21)*2=17192
 

发表于 2017-07-27 01:40:28 回复(0)
不需要考虑内存对其吗?
发表于 2017-05-31 13:26:07 回复(0)
对于a[i,j]来说,它的地址是:10000+2*(65*(i-1)+(j-1))
发表于 2017-05-01 15:01:04 回复(0)
下标如果从1开始,那么计算时,index都减去1。如果下标从0开始,直接使用index
发表于 2017-04-27 17:04:34 回复(0)
、行优先:基址+((行数-1)*m+列数-1)×每个元素所占内存单位,即10000+((56-1)×65+22-1)×2=17192
发表于 2017-02-21 10:00:19 回复(0)
看评论看要注意,这里求的是起始地址
发表于 2017-02-19 07:26:59 回复(0)
前55行有65列,差点弄成22列了,第56行有22个元素,叫去首地址的元素。
发表于 2016-12-22 17:34:59 回复(0)