-1

ポインタを使用してCの2D配列の要素にアクセスしたい

たとえば(これは従来の方法を使用しています)

multi[0][1] = ....

私はこのように試しました

*(*(multi+0)+1) = ....

しかし、それは私に言ってエラーを与えます

" pointer required "

だから私は何をすると思いますか?

実はこれが私がやっていたことです

void state_array(int *pointer , int *multi){
   int i ;
   for ( i = 0 ; i < 4 ; i++){
   *(*(multi + i) + 0 )= *(pointer+i) ;
                                }
     for ( i = 4 ; i < 8 ; i++){
   *(*(multi + i ) + 1 )= *(pointer+i) ;
                                }
    for ( i = 8 ; i < 12 ; i++){
   *(*(multi + i ) + 2 )= *(pointer+i) ;
                                }
   for ( i = 12 ; i < 16 ; i++){
   *(*(multi + i ) + 3 )= *(pointer+i) ;
                                }
                                  }
4

2 に答える 2

1

特定のエラー メッセージが表示される理由は、変数のmultiint *が ではなく であるためint **です。あなたの関数は、それint ***(*(multi + i ) + j)

式を分解します。

  1. *(multi + i)ポインターを逆参照しますmulti+imultiは type なので、int *これで問題ありません。結果の型はint.
  2. *( ... + j)を逆参照しようとし... + jます。問題はそれ...が typeintであり、... + jtypeであるということですint。an を逆参照することはできませんint(ポインターではなく整数型です)。

2 つのソリューション:

  1. multitype であることを宣言しint **、実際のint **
  2. として保持multiし、int *単一インデックス アドレッシングを使用する

解決策 1 は、 の配列を割り当ててから、 の配列int *を指すように埋める場合にのみ機能しますint。Cで多次元配列を宣言した場合 (つまり、) は機能しませんint myarray[23][78]。C では、宣言された多次元配列は連続したメモリに保持され、ポインタからポインタへのポインタとして関数に渡すと、この情報は失われます。

2 番目の解決策は、行優先または列優先のインデックス付けを選択し、適切なサイズで渡すことです。とにかく、おそらくこれを行う必要があります。行優先のインデックス付け (行がメモリ内で連続している) を選択した場合、M x N 行列multiは次のようにアドレス指定されます。

multi[i + M*j]

列優先のインデックス付け (メモリ内で列が連続している) を選択した場合、同じ行列が次のようにアドレス指定されます。

multi[N*i + j]

このソリューション、C で静的に宣言された多次元配列に対して機能し、最小限のオーバーヘッドで C で多次元配列を動的に割り当てることができます。

また、C で静的に宣言された多次元配列は、としてアクセスされる場合、列優先のインデックス付けを使用することに注意してくださいmat[i][j]。ただし、本格的なマトリックス作業を行っている場合は、行優先のインデックス付けを優先する十分な理由があります。最後に、Fortran は行優先のインデックスを使用します。コードが Fortran とインターフェイスする必要がある場合 (数値コードがよく行うように)、おそらく行優先のインデックスを優先する必要があります。

于 2012-06-26T14:23:21.980 に答える
1

( (multi+0)+1)で問題ありません。それが動作します。エラーを見つけるには、完全なコードを指定してください。

リンク参照

于 2012-06-26T13:27:00.030 に答える