誰かがこの小さなコード スニペットを説明してくれませんか?
与えられた:
int a[3] = {2,3,4};
以下が true と評価されるのはなぜですか?
static_cast<void *>(a) == static_cast<void *>(&a); // Why is this true?
address of a
これは が と同じであると言っていa
ますか? もしそうなら、なぜこれは本当ですか?
誰かがこの小さなコード スニペットを説明してくれませんか?
与えられた:
int a[3] = {2,3,4};
以下が true と評価されるのはなぜですか?
static_cast<void *>(a) == static_cast<void *>(&a); // Why is this true?
address of a
これは が と同じであると言っていa
ますか? もしそうなら、なぜこれは本当ですか?
これは、変数a
のアドレスが配列の最初の要素のアドレスと一致するためa
です。また、「配列の最初の要素のアドレス」と言うと、どちらがより明確であるa
かを考えることができます)。&a[0]
もう一つの例、
struct X
{
int i;
};
X x;
ここでも、変数x
のアドレスはx.i
(集約の最初の要素である) のアドレスと一致するため、次のように出力され1
ます。
std::cout << (&x == &(x.i)) << std::endl; //1
したがって、あなたの場合、&a
は のよう&x
であり、a
(または&a[0]
) は のよう&(x.i)
です。
C++ ではa
とx
は両方とも集計と呼ばれることに注意してください (ここで私の回答を参照してください:集計とは何ですか? )
ほとんどすべてのコンテキストで、配列の名前は配列の最初の要素へのポインターに分解されます。ではstatic_cast<void*>(a)
、 は にa
崩壊し&a[0]
ます。タイプは「intへのポインター」です。式は、配列の最初の要素のアドレスに評価されます。ただしstatic_cast<void*>(&a)
、&a
は配列自体のアドレスです。その型は「3 int の配列へのポインタ」です。これが、ここでキャストが必要な理由です。キャストのない 2 つの式は異なる型になり、比較できません。どちらも変換しvoid*
て比較できます。つまり、このコードが示しているのは、配列の最初の要素のアドレスが配列のアドレスと同じであることです。つまり、先頭にパディングがありません。
配列の名前は通常、配列の最初の要素のアドレスとして評価されるため、array と &array はまったく同じ値になります。
ただし、それらは異なるタイプです。次の配列の場合:
int a[8];
a+1 は配列 a + sizeof(int) のアドレスですが、 &a+1 は配列 a + 8 * sizeof(int) のアドレスになります。