-4

C の 2 次元配列について混乱しています。私のコードは次のとおりです。

main()
{
    int i, j;
    int arr[3][4] = {
                     { 1, 2, 3, 4 },
                     { 5, 6, 7, 8 },
                     { 9, 0, 1, 6 }
                    };    

    printf("\narr: %u", arr);
    printf("\n&arr: %u", &arr);
    printf("\n*arr: %u", *arr);
}

上記のプログラムの出力は次のとおりです。

arr u: 3215469448
&arr: 3215469448
*arr: 3215469448

ここで、3 つの printf ステートメントすべてが単一の場所の住所を表示する方法を教えてください。これらのアドレスがどのように同じであるかを大まかに説明してください。

以前にも同様の質問がありましたが、役に立ちませんでした。C の 2D 配列のメモリ マップと 2D /多次元配列の MEMORY MAP を参照しないでください...

4

2 に答える 2

1

メモリ内では、配列は次のようにレイアウトされます

Low address                                  High address

  +---+---+---+---+---+---+---+---+---+---+---+---+
  | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 6 |
  +---+---+---+---+---+---+---+---+---+---+---+---+
  ^               ^               ^
  |               |               |
arr[0]          arr[1]          arr[2]
  ^
  |
 arr

上記の粗い ASCII イメージに見られるように、 と の両方が同じメモリ位置arrarr[0]指しています。そして as *arris the same as arr[0](これは と同じです) なら、とが同じであるarr理由は簡単にわかります。arr*arr

奇妙に思えるかもしれませんが、それも同じです。従来は、変数が指すものではなく、変数&arrの場所である必要があります。その理由は C 仕様 (最後の C11 ドラフトの §6.5.3.2/3) にあります。 arr

同様に、オペランドが [] 演算子の結果である場合、[] によって暗示される & 演算子も単項 * も評価されず、結果は、& 演算子が削除され、[] 演算子が次のように変更されたかのようになります。 + 演算子。

これが意味することは、基本的に、アドレス取得演算子&が配列で使用された場合、配列のアドレスを返すだけであるということです。

于 2012-11-30T06:15:39.087 に答える
0

最初にarr、2 次元配列メモリ ブロックの先頭アドレスをポイントします。これは、変数のarrアドレスが2次元配列のメモリブロックのアドレスと同じであることを意味します。

printf("\narr: %u", arr);

ポインタ値を表示する

printf("\n&arr: %u", &arr);

variable の参照を表示しますarr。上記の2dブロックの先頭アドレスと同じです。

printf("\n&arr: %u", *arr);

arrものアドレスを指すポインターなa[0]ので*arr、 の逆参照を意味し&arr[0]ます。すなわち*&arr[0]= arr

于 2012-11-30T05:28:04.660 に答える