1

次のような 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?
4

2 に答える 2

5
  1. C++ コンパイラを使用して C プログラムをコンパイルしています。気を付けて!

  2. c関数の上に の定義を配置するgetC(または前方宣言を提供する) 必要があります。

  3. 関数の外にステートメントがありますが、これは C では許可されていませんint *aint main(void) { ... }

  4. 呼び出しを有効&にするには が必要です。getC()int *int **

    getC(&a);
    
  5. ステートメントa[0][0]は効果がなく、とにかく間違っていaますint *。2 回逆参照することはできません。

おそらく、初心者用の C の本を入手して、それを読み始める必要があります。

于 2013-06-10T15:27:41.233 に答える
0

基本的に、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)
        ...
}
于 2013-06-10T15:57:03.583 に答える