次のような 2 次元配列があります。
void getC(int **p)
{
*p = &c[0][0];
}
int c[10][10];
int *a;
getC(a);
a[0][0];
it says error: no match for 'operator[]' in `a[0][0];` what is the problem and how to fix it?
C++ コンパイラを使用して C プログラムをコンパイルしています。気を付けて!
c
関数の上に の定義を配置するgetC
(または前方宣言を提供する) 必要があります。
関数の外にステートメントがありますが、これは C では許可されていませんint *a
。int main(void) { ... }
呼び出しを有効&
にするには が必要です。getC()
int *
int **
getC(&a);
ステートメントa[0][0]
は効果がなく、とにかく間違っていa
ますint *
。2 回逆参照することはできません。
おそらく、初心者用の C の本を入手して、それを読み始める必要があります。
基本的に、2dim 配列の最初の要素のアドレスを返すだけで、配列/ポインターをint (*)[10]
(10 int の配列へのポインター) から単純なにダウングレードしています。int pointer
これは技術的には正しいですが (2dim 配列の 1 つの要素のアドレスはもちろん int* です)、配列内の int の構造/レイアウトに関する情報は失われるため、結果の a-ptr は何もしません。 int が [10][10] 構造の一部であるという事実について。
あなたの場合、配列要素に到達する唯一の方法は、アドレス a に 10x10 で編成された 100 個の int があるという独自の知識に基づいて、int 配列を乗算することです。
int *a;
getC(&a);
...= a[10*x + y]; // equivalent of c[x][y];
.
ただし、基本的には、正しい方法 (型を完全に保持する) は次のようになります。
int c[10][10];
void getC(int (**p)[10]) // pointer to pointer to array of 10 ints
{
*p = c; // c itself can seamlessly change into a pointer to one sub-element
// (i.e. pointer to array of 10)
}
int main()
{
int (*a)[10]; // pointer to array(s) of 10 ints
int q;
getC(&a);
q= a[9][9];
...
}
もう 1 つのディメンション レベルで同じことを繰り返します (おそらく最も直感的な解決策です)。
ただし、基本的には、正しい方法 (型を完全に保持する) は次のようになります。
int c[10][10];
void getC(int (**p)[10][10]) // pointer to pointer to array of 10x10 ints
{
*p = &c; // &c can seamlessly change into a pointer to 10x10 ints
}
int main()
{
int (*a)[10][10]; // pointer to array(s) of 10x10 ints
int q;
getC(&a); // pass adress of pointer to 10x10 ints
q= (*a)[9][9]; // need *a in brackets to derference the pointer (operator precedence)
...
}