質問
私はポインターと参照の全体的な意味を理解しています (または少なくとも理解していると思います)。また、使用するときの意味も理解しています。 新しい 動的にメモリを割り当てています。
私の質問は次のとおりです。
私が使うとしたら cout << &p
, 、「仮想メモリの場所」が表示されます。 p
。この「仮想メモリの場所」を操作する方法はありますか?
たとえば、次のコードは次の配列を示しています。 int
s.
の価値を示したい場合は、 p[1]
そして私はその「仮想記憶の場所」を知っていました p
, 、なんとかできませんか?」&p + 1
" の値を取得します。 p[1]
と cout << *p
, 、これは配列の 2 番目の要素を指すことになるでしょうか?
int *p;
p = new int[3];
p[0] = 13;
p[1] = 54;
p[2] = 42;
解決
確かに、ポインターを操作して配列内のさまざまな要素にアクセスすることはできますが、ポインターの内容 (つまり、ポインター自体のアドレスではなく、p が指しているもののアドレス)。
int *p = new int[3];
p[0] = 13;
p[1] = 54;
p[2] = 42;
cout << *p << ' ' << *(p+1) << ' ' << *(p+2);
それぞれの加算 (または減算) は、配列内の後続の (前の) 要素を意味します。p が 4 バイト変数を指している場合 (例: 整数 一般的な 32 ビット PC の場合)、アドレスが 12345 の場合、p+1 は 12346 ではなく 12349 を指します。p が指すものにアクセスするために p を逆参照する前に、その値を変更する必要があることに注意してください。
他のヒント
完全ではありません。 &p
住所です ポインタの p
. &p+1
1 つのアドレスを参照します int*
さらに先へ。あなたがやりたいことは
p=p+1; /* or ++p or p++ */
今あなたがそうするとき
cout << *p;
54 が得られます。違いは、 p
が含まれています int 配列の先頭アドレス, 、 その間 &p
それは pのアドレス. 。1 つの項目を移動するには、さらに奥までポイントする必要があります。 整数配列, 、スタックのさらに先にはありません。 p
生きています。
あなただけが持っていたら &p
その場合は、次のことを行う必要があります。
int **q = &p; /* q now points to p */
*q = *q+1;
cout << *p;
私の記憶が間違っていなければ、これでも 54 が出力されます。
ポインターを使ってからしばらく (何年も) 時間が経ちましたが、p が配列の先頭を指している (つまり、p[0])、それをインクリメントしました(つまり、p++) の場合、p は p[1] を指すことになります。
値を取得するには p を逆参照する必要があると思います。ポインタを逆参照するには、ポインタの前に * を置きます。
したがって、*p = 33、p[0] を 33 に変更します。
2 番目の要素を取得するには *(p+1) を使用すると思うので、必要な構文は次のようになります。
cout << *(p+1)
または
cout << *(++p)
私はこれをするのが好きです:
&p[1]
私にはそのほうがきれいに見えます。
C および C++ の「ポインター型」は、非常に長い論理的な構造を敷いたものと考えてください。 セルの行 CPU のメモリ空間のバイト 0 から始まるバイトに重ね合わされます。各セルの幅 (バイト単位) は、ポインタの「タイプ」によって異なります。各ポインター タイプは、異なるセル幅の行を配置します。あ "int *"
int の記憶域幅は 4 バイトであるため、ポインタは 4 バイトのセルの行を配置します。あ "double *"
セルごとに 8 バイトの行を配置します。ある "struct foo *"
ポインタは、各セルの幅が 1 つの行に配置されます。 "struct foo"
, 、それが何であれ。あらゆる「物」の「アドレス」は、「物」を保持する行のセルの 0 から始まるバイト オフセットです。
ポインター演算は、バイトではなく、行内のセルに基づいて行われます。 "*(p+10)
" は "p" の後の 10 番目のセルへの参照であり、セルのサイズは p の型によって決まります。「p」の型が「int」の場合、「p+10」のアドレスは p から 40 バイトです。p が長さ 1000 バイトの構造体へのポインタの場合、「p+10」は p から 10,000 バイト先になります。(コンパイラは、予想よりも大きい構造体の最適なサイズを選択することに注意してください。これは「パディング」と「位置合わせ」によるものです。たとえば、説明した 1000 バイトの構造体は実際にはセルごとに 1024 バイトを必要とするため、「p+10」は実際には p を超えて 10,240 バイトになります)。