二维阵列计算公式

时间:2013-10-19 05:21:35

标签: c++ multidimensional-array

假设A[10][10]的地址为40000,双重占用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

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

3 个答案:

答案 0 :(得分:4)

在C ++中,2d数组只是一个数组数组,所以在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)的相对地址(以查找数组的开头),然后添加(40, 50)的相对地址来获得相同的结果。 / p>

答案 1 :(得分:2)

答案取决于您是使用行主要排序还是列主要排序。在行主要排序中,数据以行方式存储。在列主要排序中,数据以列方式存储。考虑将以下2D数组存储在内存中,

    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

答案 2 :(得分: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)

用等式验证,

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

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