3
int matrix[9][9],*p;
p=matrix[0]; 

これは機能し、の最初の行を提供しますが、私が試したmatrix最初の列を取得するにはどうすればよい ですか?また、以下のコードでコンパイラエラーが発生する理由がわかりません。matrixp=matrix[][0];

int matrix[9][9],p[9];  // it looks really ugly, byt why it doesn't work ?
p=matrix[0];            // compiler gives "invalid array assigment"

多次元配列は配列の配列でありmatrix[i][j]、i番目のネストされた配列のj番目の要素として解釈する必要があるためですか?

4

8 に答える 8

15

C/C++ では、多次元配列は実際には 1 次元配列として (メモリに) 格納されます。2D マトリックスは、行優先の 1 次元配列として格納されます。そのため、そこから列を取得するのは簡単ではなく、デフォルトでは提供されていません。多次元配列の列を表すポインタを取得できるメモリ内の連続配列はありません。下記参照:

するとp=matrix[0]、最初の要素へのポインターを取得しているだけなので、matrix[0][0]最初の行へのポインターを取得したと思われます。実際には、matrix次のように、 を保持する連続した配列全体へのポインタです。

matrix[0][0]
matrix[0][1]
matrix[0][2]
.
.
matrix[1][0]
matrix[1][1]
matrix[1][2]
.
.
matrix[8][0]
matrix[8][1]
matrix[8][2]
.
.
matrix[8][8]

上記のように、特定の列の要素は、対応する行の他の要素によって区切られています。

したがって、補足として、ポインターを使用pすると、必要に応じてマトリックスの 81 個の要素全体をウォークスルーできます。

于 2013-03-06T21:11:58.637 に答える
8

次のようなループを使用して最初の列を取得できます

for(int i = 0; i < 9; i++)
{
    printf("Element %d: %d", i, matrix[i][0]);
}

アドレスではないものをポインターに割り当てようとしているため、割り当てが正しく機能していないと思います。

(すみません、これはCコードです)

于 2013-03-06T21:13:02.783 に答える
4

matrix[81]指定するかどうかに違いはありません。matrix[9][9]

matrix[r][c]単に同じことを意味しますmatrix[9*r+c]

次のような多次元配列に適した他のコンテナがありますboost::multi_array

http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html

連続したメモリを割り当てるのと同じように、裸の配列を考えてください。プログラマーは、このメモリの一部を自分で処理する必要があります。配列の生の名前は、たとえばmatrix、この割り当てられたメモリ部分の最初の要素へのポインタです。その後はまたは*(matrix+1)と同じです。matrix[0][1]matrix[1]

于 2013-03-06T21:22:17.420 に答える
2

p は int の配列、matrix[0] はポインターです。

于 2013-03-06T21:11:13.997 に答える
1

matrix(matrix + 1)[0][0]それ自体は、 と同じである限り、配列の列に到達できる最も近いものですmatrix[1][0]

于 2013-03-06T21:13:35.820 に答える
0

マトリックスを連続した場所に配置する場合は、それを 1 次元配列として宣言し、行と列の計算を自分で実行します。

int contiguous_matrix[81];

int& location(int row, int column)
{
  return contiguous_matrix[row * 9 + column];
}

行の各列を反復処理することもできます。

typedef void (*Function_Pointer)(int&);

void Column_Iteration(Function_Pointer p_func, int row)
{
  row = row * MAXIMUM_COLUMNS;
  for (unsigned int column = 0; column < 9; ++column)
  {
    p_func(contiguous_matrix[row + column]);
  }
}
于 2013-03-06T21:45:33.853 に答える
0

静的に宣言された配列の場合、連続する 1D 配列のようにアクセスできp = matrix[0]、1 行目の 1 列目を取得できます。p[i]その後、 、*(p+i)、またはのように 1D 配列にアクセスできますp[current_raw * raw_size + current_column)

2D 配列が で表さ**pれる場合、1D 配列へのポインターの配列として解釈されるため、注意が必要です。

于 2017-07-26T08:26:47.593 に答える