と仮定する
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]
に関係なく、これは当てはまります。)array
int[16]
int*
当然のことながら、ポインタをvoid
ポインタに変換すると、意味上の違いは失われます。