重複の可能性:
C: 配列のアドレスがその値と等しいのはなぜですか?
int a[2];
printf("%u %u", (int)(&a), (int)(a));
&a
のアドレスを指すポインタだと思いますa
。2 つ目a
は、配列の先頭アドレスを意味します。
なぜ同じなのですか?
重複の可能性:
C: 配列のアドレスがその値と等しいのはなぜですか?
int a[2];
printf("%u %u", (int)(&a), (int)(a));
&a
のアドレスを指すポインタだと思いますa
。2 つ目a
は、配列の先頭アドレスを意味します。
なぜ同じなのですか?
&
単項演算子または演算子のオペランドである場合を除いて、どのコンテキストでもsizeof
、配列名は配列a
の最初のメンバーへのポインターに評価されます。これには型がありint *
ます。
では&a
、a
は配列自体を指定するため、配列&a
のアドレスも指定します。これには型があります。int (*)[2]
配列の最初の要素は配列の先頭にあるため、配列のアドレスと最初の要素のアドレスは必然的に一致するため、同じ値が表示されます。
(実際には、%p
フォーマット指定子を使用してポインターを出力する必要があります)。
これは、それらがすべて同じアドレスを指しているからです。
&a
のアドレスですa
a
配列自体です(その先頭)&a[0]
最初の要素であるため、同じアドレスでもありますしたがって、これらの例を常に にキャストするとint
、a
のアドレスになります。a
型キャストが正しく行われた場合、配列の最初の要素は常に最初の要素を指すため、配列の最初の要素は常にその最初の要素を指します。
&a
定数である配列のベースアドレスです。またa
、最初の要素を保持します。