&a
配列のアドレスを提供します。タイプint (*)[3][3]
です。簡単。
a
配列自体を示し、配列からポインターへの変換が行われて、配列の最初の要素へのポインターになります。配列の最初の要素は type の部分配列であるint[3]
ため、その部分配列へのポインターを取得します。このポインタの型はint (*)[3]
です。最初のサブ配列が配列の先頭にあるため、これは以前と同じアドレスを持ちます。
を使用*a
すると、配列は配列からポインターへの変換を再度実行して、以前と同じサブ配列へのポインターを取得します。これは、サブ配列自体を取得するための逆参照です。次に、サブ配列を表すこの式も配列からポインターへの変換を受け、最初の要素へのポインターが得られます。最初の要素の型int
は であるため、ポインターの型はint*
です。最初の要素のアドレスは、それが含まれる部分配列のアドレスと同じであり、これまで見てきたように、配列全体と同じアドレスです。
&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]
これらの領域はすべて同じアドレスで始まるため、ポインターは同じ値になります。