假设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
我在这里正确应用了公式吗?我不确定我是否插入了正确的值?
答案 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.