配列と &array の違いは何ですか? 質問する

配列と &array の違いは何ですか? 質問する

と仮定する

int array[16];

配列からポインタへの変換と呼ばれる標準的な変換があるため、 はarray暗黙的に 型に変換されますint*が、 が と&array等しいのはなぜですかarray?

例えば、

int array[16];
void *p = array;
void *q = &array;
printf("%p\n", p);
printf("%p\n", q);

これにより、同じアドレスが生成され、コンパイル エラーは発生しません。

なぜ?

ベストアンサー1

の型は&array( int (*)[16]16 個の整数の配列へのポインタ)arrayです。 の型は、減衰するとint*(整数へのポインタ) になります。 どちらも同じ場所を指していますが、コンパイラにとっては意味が異なります。

を実行すると(&array)[0]、最終的に得られる値は 16 個の整数の元の配列となり、 のように再度添字を付けることができます(&array)[0][0]。は(&array)[1]、もし存在するなら、次の 16 個の整数の配列になります。

とするとarray[0]、最終的に得られる値は整数となり、再度添え字を付けることはできません。は単に次の整数になります。(が であるか であるかarray[1]に関係なく、これは当てはまります。)arrayint[16]int*

当然のことながら、ポインタをvoidポインタに変換すると、意味上の違いは失われます。

おすすめ記事