1
int a[3][3]={5};
printf("&a = %u \n a = %u \n*a = %u\n&a[0][0]=%d\na[0][0]", &a, a, *a, &a[0][0], a[0][0]);

出力:-

&a = 2359028
 a = 2359028
*a = 2359028
&a[0][0]=2359028
a[0][0] =5

これらはどのようにすべて同じになることができますか? a=2359028 の値の*a場合、アドレス 2359028 で値を与えるべきではありません。つまり 5 ですか?

4

3 に答える 3

5
  1. &a配列のアドレスを提供します。タイプint (*)[3][3]です。簡単。

  2. a配列自体を示し、配列からポインターへの変換が行われて、配列の最初の要素へのポインターになります。配列の最初の要素は type の部分配列であるint[3]ため、その部分配列へのポインターを取得します。このポインタの型はint (*)[3]です。最初のサブ配列が配列の先頭にあるため、これは以前と同じアドレスを持ちます。

  3. を使用*aすると、配列は配列からポインターへの変換を再度実行して、以前と同じサブ配列へのポインターを取得します。これは、サブ配列自体を取得するための逆参照です。次に、サブ配列を表すこの式も配列からポインターへの変換を受け最初の要素へのポインターが得られます。最初の要素の型intは であるため、ポインターの型はint*です。最初の要素のアドレスは、それが含まれる部分配列のアドレスと同じであり、これまで見てきたように、配列全体と同じアドレスです。

  4. &a[0][0]最初に最初のサブ配列の最初の要素を取得し、次にそのアドレスを取得します。これにより、前のポイントとまったく同じポインターが得られます。

したがって、これらのポインターはすべて同じ値になります。

概略的に:

  0,0   0,1   0,2   1,0   1,1   1,2   2,0   2,1   2,2
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

└─────────────────────────────────────────────────────┘
            &a points at the entire array

└─────────────────┘
  a gives you a pointer to the first subarray

└─────┘
  *a gives you a pointer to the element 0,0
  and so does &a[0][0]

これらの領域はすべて同じアドレスで始まるため、ポインターは同じ値になります。

于 2013-05-09T15:35:46.570 に答える
0

C では、配列が式に含まれる場合 (たとえば、関数に渡される場合やポインター演算で使用される場合)、配列は暗黙的にポインターに変換されます。に渡しaているためprintf、暗黙的に へのポインタに変換されます。aこれは と同じ&aです。

は、配列のアドレスを返した*aに対する二重逆参照のように見えるという事実に混乱するかもしれません。したがって、このロジックによって の値が得られるはずです。しかし、そうではありません。&a*aa[0][0]

于 2013-05-09T15:36:27.680 に答える
0

「...アドレス 2359028、つまり 5 に値を与えるべきではありませんか?」

はいといいえ。*a実際に addressのオブジェクトaを提供する必要があります。ただし、あなたの場合aは typeint[3][3]です。これは、このレベルの間接性では、アドレスのオブジェクト(ポインターとしてa解釈する場合) は、あなたが誤って信じているようなものではなく、実際には 1D 配列全体であることを意味します。isの型とisに格納される値は、やはり 1D サブ配列全体です。a5a[0]*aint [3]*aa[0]

したがって、しようとすると、実際には部分配列printf *a全体を引数として指定しています。a[0]その部分配列は、自然に同じ場所を指し示すポインターに減衰します (配列全体aとその最初の部分配列a[0]がメモリ内で同じ場所にあるため)。これが、a*aをポインター (および&a) として出力すると、同じ数値が出力される理由です。

この場合にアクセスしたい5場合は、 を実行する必要があります**a。だけ*aでは十分ではありません。

于 2013-05-09T15:49:28.923 に答える