6

のアドレス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++ では、2 次元配列は単なる配列の配列であるため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 に答える
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 が指定するように、行方向または列方向の 2 つの方法で実行できます。式から、行方向の移動が選択されているように見えます。

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

= 13 entries.

したがって、A[4,2] のアドレス = 1000 + 13*(エントリあたりのバイト数)

方程式で確認するには、

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 に答える