3

私はちょうどポインターで遊んでいて、この奇妙なことを見つけました。次のプログラムで行ったように、ポインタを作成してpそのアドレスを表示しました。アドレスp&pは異なりますが、なぜ異なるのですか?

int main()
{
    int *p, s[5];
    cout << p <<endl;
    cout << &p <<endl;
    p = s;
    cout << p <<endl;
    cout << &p <<endl;
}
4

3 に答える 3

3

P整数へのアドレスを保持することを意味するポインタです。したがって、 p を出力すると、それが指す整数のアドレスが表示されます。一方、印刷&pすると、実際には p が指すアドレスではなく、 p 自体のアドレスが印刷されます。

于 2012-07-12T05:56:26.327 に答える
1

Jeevaが言ったように、ポインタpもメモリの一部を占有し(この写真の黄色の部分、そのアドレスは0x300です)、この領域に配列sのアドレスである値を保持します。したがって、p == 0x100 および &p == 0x300ポインター

于 2012-07-12T06:17:34.703 に答える
1

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

なんで?オブジェクトは通常、メモリ内の最初のデータ メンバーと同じアドレスから開始されるためです。

于 2012-07-12T06:31:27.283 に答える