1

次のコードスニペットを含むCテキストを読んでいたときに、逆参照されたポインターの値に関して混乱が生じていることに気付きました。

int main() 
{ 
    int matrix[3][10];                 // line 3: matrix is tentatively defined
    int (* arrPtr)[10] = matrix;       // line 4: arrPtr is defined and initialize
    (*arrPtr)[0] = 5;                  // line 5: what is the value of (*arrPtr) ?

私の混乱は、最後の行の*arrPtrの値に関するものです。これがそれまでの私の理解です。

3行目、行列は、int型の10個の要素の配列型の3個の要素の配列であると宣言されています(暫定的に定義されています)。

4行目、arrPtrは、int型の10個の要素の配列へのポインターとして定義されています。また、10個の要素の配列(つまり、行列の最初の行)へのptrとして初期化されます。

5行目でarrPtrが逆参照され、実際の配列が生成されるため、その型は10intの配列になります。

私の質問:なぜ配列の値は、配列のアドレスだけであり、その要素に何らかの形で関連していないのですか?

4

3 に答える 3

1

配列変数の値は配列ですmatrix 、(簡単に)最初の項目へのポインターに「劣化」し、次にそれをに割り当てますarrPtr

これを確認するには、&matrix(has type int (*)[3][10])またはsizeof matrix(equals sizeof(int) * 3 * 10)を使用します。

さらに、その定義については暫定的なものは何もありません。

編集:コードコメントに隠れている質問を見逃しました:*arrPtrはタイプのオブジェクトであるint[10]ため、それを使用[0]すると、最初のアイテムを取得し、次にそれを割り当て5ます。

ポインタと配列は、同じように動作するように意図的に定義されており、これは(さまざまな癖を学ぶ前に)混乱することがありますが、非常に用途が広く便利です。

于 2009-12-22T19:29:01.447 に答える
0

質問を明確にする必要があると思います。の値を意味する場合、printf("%i", arrPtr);それは配列のアドレスになります。あなたが意味するならprintf("$i",(*arrPtr)[0] );、私たちはもっと肉付きの良い質問があります。

于 2009-12-22T19:32:17.483 に答える
0

Cでは、配列はほとんど便利なものです。すべての「配列」変数は、データのブロックの開始へのポインターです。と同じように、つまりintのメモリ内の位置と同じように、anint []はダブルポインタであり、メモリ内の位置を指します。別のポインタは、実際の特定のintを指します。int*int [][]int**

于 2009-12-22T19:32:32.750 に答える