查找2D阵列单元存储器位置

时间:2016-09-17 12:49:35

标签: c arrays data-structures

有一个数组 a [3] [4] ,我们必须使用行主要顺序找到 a [2] [2] 的地址 1001作为基地。我发现2个公式确实找到了地址:

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)

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

1 个答案:

答案 0 :(得分:1)

正如amit所说,方程式是不同的,因此它们不会给出相同的结果。当对这样的问题产生怀疑时,尝试在方程式中加入一些数字并尝试它们,所以如果我们尝试的是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是矩阵的列数