2013-10-19 19 views
6

A[10][10]のアドレスが40000、doubleが16バイト、バイトアドレッシングが使用されているとします。A[40, 50]のアドレスは何ですか?2次元配列計算式

私はちょうど2Dでシンプルなポイントを計算しようとしていると私は正しくここに式を適用しました私は式

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

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

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

40000+[900]*16 = 54400 

に正しい値に差し込まれていることをダブルチェックしたかったのですか?私は正しい値を差し込んだかどうか分からなかったのですか?

+1

あなたは 'A [10] [10]'だけと宣言された配列内の 'A [40] [50]'のアドレスを求めていますか?その場合、アドレスは* undefined *です。その配列は 'A [0..9] [0..9]'からのみアドレス可能です。また、指定されたベースアドレスがベース16かベース10のどちらであるのか分からないが、アドレス指定ができない要素要求があれば、それは正直なところ重要ではない。 – WhozCraig

+0

あなたはあなたの配列をどのように宣言しましたか?あなたの配列サイズ[M、N]は何ですか? –

+0

はA [100] [100]です。 – user1789951

答えて

2

答えは、行のメジャー順序または列メジャー順序を使用しているかどうかによって異なります。行の主要な順序付けでは、データは行ごとに格納されます。列の主要な順序付けでは、データは列方向に格納されます。行主要な順序で

11 22 33 

    44 55 66 

    77 88 99 

、メモリに格納されるべき次の2次元配列を検討要素は11,22,33,44,55,66,77,88,99ように隣接して格納されています。 列メジャーオーダーでは、要素は連続的に格納されます11,44,77,22,55,88,33,66,99

+0

Cでは – user1789951

0

次式の意味:

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

あなたはA [n]は[n]の配列を持っていて、AのエントリA [LBR] [LBC] BAとして、そのアドレスのアドレスを知っている場合[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のアドレス[4,2]を算出する必要がある[2,1] = 1000のアドレスを知っていると仮定します。今[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 *(エントリごとnumOfbytes)

のアドレス、従って

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

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

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)の要素の内のアドレスは、あなたが検索している要素は、したがって、アドレスがなり、30行下、与えられた要素の右側に40個の要素であることを知って、あなたの場合は

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

です

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

合計88640。

(10, 10)の相対アドレスを(配列の先頭を見つけるために)与えられたアドレスから引いて、次に(40, 50)という相対アドレスを追加することで、同じ結果が得られます。

+0

が指定されていないので、行表現のみですか?列表現はありませんか? – user3995169

+0

Cでは、行列は単なる配列の配列なので、**最後のインデックス**をインクリメントすると、メモリ内の次の連続する要素に到達します。 Cのレイアウト手法は「行優先」と呼ばれています。http://en.wikipedia.org/wiki/Row-major_orderを参照してください。 – 6502