C配列は非常に混乱しており、C ++はCと互換性があるという混乱を継承しています。配列がどのように機能するかを理解するための基本は、次のとおりです。
1)配列変数は、式内で最初の要素へのポインターとして動作しますが、定数であり(つまり、「array = p;」は実行できません)、sizeof(array)は配列のサイズ(1要素のサイズ× sizeof(pointer)はポインタのサイズを示しますが、要素の数)。
int array[5];
int* p = array;
その場合、次の式が真になります。
array[0] == *array
sizeof(array) == sizeof(int)*5
sizeof(p) == sizeof(void*)
2)関数の引数を配列として定義すると、常に最初の要素へのポインターとして渡されます。そして、そのように機能で動作します。実際、Cはその場合、渡された配列のサイズを無視します。さらに、関数内で引数を配列または配列の要素へのポインターとして定義することは、コンパイラーによって同じであると見なされます。それで:
void func(int array[5]);
void func(int array[]);
void func(int *array);
まったく同じ関数を宣言し、この関数内でsizeof(array)== sizeof(void *)
そのため、配列は常に参照によって渡され、最初の要素へのポインタのように見えます。
現在、多次元配列は、実際には、要素が配列である1次元配列です。それについてのC/C ++の紛らわしい部分は、C /C++が一般的に型を定義する紛らわしい方法です。それで:
test* array[9][9];
C / C ++型を読み取るには、識別子から開始し、[]と()が優先されるため、arrayは9要素の配列(最初の[9])であり、9要素の配列(2番目の[9])であることに注意してください。これは「test」タイプへのポインタです。
ここで、このメソッドのarr引数について:
bool sodoku::theRow(test (*arr)[9][9], int testNumber, int row)
arrは、9つの「テスト」要素の9つの配列の配列へのポインター(括弧は優先順位を変更します)です。
これは、上記の前の「array」変数とは大きく異なります。特に、「array」には「test」へのポインタが含まれ、arrには「test」要素が含まれるためです。
ところで、次の宣言は完全に同じです。
bool sodoku::theRow(test arr[][9][9], int testNumber, int row)
「arr」は、9つの「test」への9つの配列の配列の最初の要素へのポインタとして解釈することもできます。
実際には、おそらくやりたいことは、「テスト」の9つの配列の配列を渡すことです。
boot sudoku::theRow(test arr[][9], int testNumber, int row)
{ ... }
test array[9][9];
sudoku::theRow(array, 0, 0);
また、このメソッドは次のように定義することもできます。
boot sudoku::theRow(test (*arr)[9], int testNumber, int row)
{ ... }
C / C ++のこの非常に紛らわしい配列/ポインターの取り違えについて、インターネット上に多くの情報が存在します。例:http: //pw1.netcom.com/~tjensen/ptr/pointers.htm