2016-09-17 67 views
0

有一个阵列[3] [4]和我们必须找到的一个[2] [2]使用行优先顺序1001作为基地址地址。我发现两个公式找到了该地址:查找2D阵列单元存储器位置

For any array a[M][N] Row Major Order: 

1) a[i][j] = Base Address+Datatype Size[(N*i)+j] 

2) a[i][j] = Base Address+Datatype Size[N*(i-1)+(j-1)] 

我试用过的公式,但第一个得到正确的结果,但没有第二个。这里是我发现了一个[2] [2]使用行优先顺序的地址:

Using Formula 1: 

a[2][2] = 1001+2[(4*2)+2] 
     = 1001+2[10] 
     = 1001+20 
     = 1021 (correct answer) 

Using Formula 2: 

a[2][2] = 1001+2[4*(2-1)+(2-1)] 
     = 1001+2[4+1] 
     = 1001+2[5] 
     = 1001+10 
     = 1011 (Wrong Answer) 

有没有在我的第二个公式的任何错误或有我做错了使用第二个公式计算?为什么两个答案都不一样?

+2

的列数它们都如何能够正确?他们严格**不同**! – Amit

+0

@确定,如果它们不同,那么何时使用哪个公式? –

回答

1

为阿米特说,该公式是不同的,所以他们不会给相同的结果。当曾经在关于这样的问题,疑问,尝试把一些数字的公式和尝试出来的,所以如果我们试图尺寸为4的数组,在位置2,2

公式1:(N * I )+ J,(4 * 2)+ 2 = 10

方程2:N *(I - 1)+(j - 1)= 9

你可以看到,因为它们不是相同的结果,这个问题是不是在你的代码,但公式本身

如果你感觉勇敢,你也可以尝试用归纳证明以及

要查找的内存地址数,你还需要知道一个整数多少内存空间占用,以及。您可以使用sizeof(int);来完成此操作,该操作将输出整数在系统上使用的字节数。

你还需要知道如何数组的数组在内存格式化。就像普通数组一样,数组数组是连续的,这意味着数组元素之间在内存中没有间隙。所以数组a [2] [2] {1,2},{3,4}将被格式化为这样。 1,2,3,4,

使用此你应该能够用下面的方程式address location of array a[I][j] = B + W * [N * (I- Lr) + (J - Lc)]在哪里可以找到的存储器位置: B是基地址 我是你正在寻找的 元件的行标J是您正在查找的列元素 W是元素的大小 Lr是行的下限 - 如果未给出,则为0 Lc是列的下限 - 如果未给出则为0 M是数字矩阵 N中的行的是矩阵

+0

那么什么时候使用哪个公式?有什么方法可以确定使用哪个方程式? –

+0

如果你想要一个数组位置,你还需要“廉政”类型的内存使用最多考虑,它可以在不同的系统有所不同的内存地址数量。生病编辑我的答案,包括更多关于这个 – Crimson

+0

信息再次编辑额外的信息和一个固定的方程 – Crimson