私はちょうどポインターで遊んでいて、この奇妙なことを見つけました。次のプログラムで行ったように、ポインタを作成してp
そのアドレスを表示しました。アドレスp
と&p
は異なりますが、なぜ異なるのですか?
int main()
{
int *p, s[5];
cout << p <<endl;
cout << &p <<endl;
p = s;
cout << p <<endl;
cout << &p <<endl;
}
私はちょうどポインターで遊んでいて、この奇妙なことを見つけました。次のプログラムで行ったように、ポインタを作成してp
そのアドレスを表示しました。アドレスp
と&p
は異なりますが、なぜ異なるのですか?
int main()
{
int *p, s[5];
cout << p <<endl;
cout << &p <<endl;
p = s;
cout << p <<endl;
cout << &p <<endl;
}
P
整数へのアドレスを保持することを意味するポインタです。したがって、 p を出力すると、それが指す整数のアドレスが表示されます。一方、印刷&p
すると、実際には p が指すアドレスではなく、 p 自体のアドレスが印刷されます。
Jeevaが言ったように、ポインタpもメモリの一部を占有し(この写真の黄色の部分、そのアドレスは0x300です)、この領域に配列sのアドレスである値を保持します。したがって、p == 0x100 および &p == 0x300
p
がと等しい場合&p
、ポインターはそれ自体を指します。これは、void ポインターでのみ可能です。
void* p = &p;
assert(p == &p);
ただし、これの実用的な使用法はまだ見ていません:)
ちょっと待ってください。これは自己参照再帰データ構造でも発生します。これは非常に便利です。
struct X
{
X* p;
void print()
{
std::cout << " p = " << p << '\n';
std::cout << "&p = " << &p << '\n';
}
};
X x;
x.p = &x;
x.print();
最後のノードがそれ自体を後続ノードとする、リンクされたコンテナを考えてみてください。私のシステムでの出力:
p = 0x7fffb4455d40
&p = 0x7fffb4455d40
なんで?オブジェクトは通常、メモリ内の最初のデータ メンバーと同じアドレスから開始されるためです。