有一个数组 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)
我的第二个公式中是否有任何错误,或者我在使用第二个公式的计算中做错了什么?为什么答案都不一样?
答案 0 :(得分:1)
等式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是矩阵的列数