6

假设 for 的地址A[10][10]是 40000,double 占用 16 个字节,使用字节寻址,那么 的地址是A[40, 50]什么?

我只是想计算 2D 中的一个简单点,只是想仔细检查一下我是否在等式中插入了正确的值

BA + [n * (i - LBR) + (j - LBC)] * w

40000 +[10*(40-0)+(50-0)]*16

40000+[10*(40)+(50)]*16

40000+[900]*16 = 54400

我在这里正确应用了公式吗?我不确定我是否输入了正确的值?

4

3 回答 3

4

在 C++ 中,二维数组只是数组的数组,因此在A内存中用于

A[ 0][ 0] A[ 0][ 1] A[ 0][ 2] ... A[ 0][99]
A[ 1][ 0] A[ 1][ 1] A[ 1][ 2] ... A[ 1][99]
...
A[99][ 0] A[99][ 1] A[99][ 2] ... A[99][99]

其中每一行紧跟在内存中的前一行之后。

元素的地址(row, col)

(unsigned char *)(&A[0][0]) + (row*row_size + col) * element_size

在您的情况下,您知道要搜索的元素在给定元素的右侧低 30 行,右侧有 40 个元素,因此地址将是

40000 + ((40 - 10)*100 + (50 - 10)) * 16

总计 88640。

您可以通过(10, 10)从给定地址中减去 element 的相对地址(以查找数组的开头)然后添加(40, 50).

于 2013-10-19T07:54:26.080 回答
2

答案取决于您使用的是行主要排序还是列主要排序。在行主要排序中,数据按行存储。在列主要排序中,数据按列存储。考虑以下要存储在内存中的二维数组,

    11  22  33

    44  55  66

    77  88  99

在行主要排序中,元素连续存储为11,22,33,44,55,66,77,88,99. 在列主要排序中,元素被连续存储11,44,77,22,55,88,33,66,99

于 2013-10-19T05:40:07.230 回答
0

以下等式的含义:

BA + [n * (i - LBR) + (j - LBC)] * w

如果你有一个数组 A[n][n] 并且你知道入口 A[LBR][LBC] 的地址为 BA,那么 A[i][j] 的地址可以计算如下。假设 n = 6,

00 01 02 03 04 05
10 11 12 13 14 15
20 21 22 23 24 25
30 31 32 33 34 35
40 41 42 43 44 45
50 51 52 53 54 55

这里假设我们知道A[2,1] = 1000的地址。我们需要计算A[4,2]的地址。现在要从 [2,1] 到达 [4,2],我们需要经过多少个条目?当然,正如@Deepu 指定的那样,我们可以通过两种方式进行操作,即按行或按列。从等式看来,已经选择了逐行旅行。

22 to 25 (4)
30 to 35 (6)
40 to 42.(3)

= 13 entries.

因此 A[4,2] 的地址 = 1000 + 13*(numOfbytes per entry)

用方程验证,

i - LBR = 4 - 2 = 2.
j - LBC = 2 - 1 = 1.

因此,n*( i - LBR ) + (j - LBC) = 6*2 + 1 = 13.

于 2013-10-19T06:27:22.317 回答