1

Cに適用される次の式を作成するためのトレーニング/宿題があります。

整数の行列内の要素へのアドレスを計算する方法。行列の開始アドレス、サイズ、および要素の行と列がわかっている場合。

行列が a[b][c] だとします。開始アドレスは、aまたは同等のものです。&a[0][0]

行数はbです。

列数は c です。

すべての要素にはサイズが必要なsizeof(int)ので、アドレスは次のようになりますa + b*sizeof(int) + a*sizeof(int)

この式は正しいですか?

4

3 に答える 3

1

配列が行優先で格納されていると仮定すると、次の場合を意味します。

int array[N][M];

次に、最初に にM int対応する s がarray[0]あり、次に に対応M intする s がarray[1]あります。

したがって:

  • のアドレスarray[0][c]は次のように指定されます。(char *)array + c * sizeof(int)
  • のアドレスarray[1][0]は次のように指定されます:(char *)array + 1 * M * sizeof(int) にはMint があるためarray[0]です。
  • のアドレスarray[1][c]は次のように指定されます。(char *)array + 1 * M * sizeof(int) + c * sizeof(int)
  • のアドレスarray[2][0]は次のように指定されます。(char *)array + 2 * M * sizeof(int)
  • うまくいけば、今パターンを見ることができます。つまりarray[r][c]、最初の行をスキップし(char *)array + r * M * sizeof(int) + c * sizeof(int) 、次に列をスキップします。r * Mrc

2D メモリ レイアウトの詳細については、この回答を参照してください。同じ回答には、動的配列のメモリ レイアウトも含まれています。

于 2012-10-10T11:41:35.120 に答える
1

int array[b][c]があり、 element のアドレスを見つける必要があるとしますarray[i][j]

a + i * c * sizeof(int) + j * sizeof(int)

ここでc * sizeof(int)、 は行サイズのように見えるため、これの一般的な式は次のとおりです。

array_start + i * row_size + j * item_size
于 2012-10-10T11:39:01.663 に答える
1

それについて考える別の方法は次のとおりです。

最初に、この式を使用してその要素のインデックスを計算します

i = c + r * w

ここで、c は列、r は行、w は行列/2D 配列の幅 (列の数) です。

次に、それに整数のサイズを掛けると、ベースアドレスからの要素のメモリオフセットが得られます

offset = i * sizeof(int);

最後に、それをベース アドレスに追加します。

addr = base + offset

式は次のとおりです。

addr =  base + (c+r*w) * sizeof(int)
于 2012-10-10T11:54:38.657 に答える