4

このコードがどのように機能するかを調べるというこのタスクを取得しました。

int array[rows][coloums]; 
int *pointerArray[rows]; 
for (int i = 0; i < rows; i++) { 
  pointerArray[i] = array[i]; 
  for (int j = 0; j < coloums; j++) { 
   *(pointerArray[i] + j) = 0; 
  } 
}

私が興味を持っているのは*(pointerArray [i] + j)です。要素には両方の方法でアクセスできるので、pointerArray [i] [j]と同じだと思いますが、だれでも教えてください。 *()で実際に起こっていますか?コンパイラは、imがpointerArray [i][j]と同じものを要求していることをどのように知っているのでしょうか。

答えてくれてありがとう!

4

2 に答える 2

3

を実行するときは、要素であるpointerArray[i] + jを要求し、そのポインタをインクリメントします(これも)を返します。単にポインタを逆参照し、その位置に戻ります。間接参照演算子(この場合)と呼ばれます。そうです、それはと同等です。pointerArray[i]int*jint**(...)int*pointerArray[i][j]

于 2012-09-24T21:43:13.760 に答える
2

このコンテキストでは、*演算子は間接参照演算子です。付加される値は、値を返すメモリ内の場所になります。

括弧は加算演算をグループ化しており、コンパイラーはこの加算の結果が間接参照に使用されることを認識しています。これは単に操作の順序の場合です。

[]配列は本質的に一種のポインター変数であるため、演算子は間接参照演算子と同じことを行うことに注意してください。2次元配列を、行と列を持つ値の2Dグリッドとして想像すると、メモリ内で、各行が次々に順番に並べられるようにデータが配置されます。配列の最初のインデックス(i)と配列のタイプ(int)は、行の最初の場所を探すオフセットをコンパイラに指示します。配列の2番目のインデックス(j)は、その行内のどのオフセットを調べるかを示します。

*(pointerArray[i] + j)基本的には次のことを意味します。「iでデータのth行の先頭を見つけ、その行のth要素をpointerArray選択して、その値を指定します。j

于 2012-09-24T21:50:04.007 に答える