6

私はポインターと参照の全体的な意味を理解しています (少なくとも私はそう思います)。また、newを使用するときに動的にメモリを割り当てていることも理解しています。

私の質問は次のとおりです。

を使用するcout << &pと、 の「仮想メモリの場所」が表示されますp。この「仮想メモリの場所」を操作する方法はありますか?

たとえば、次のコードは の配列を示していますint

の値を表示したくてp[1]、 の「仮想メモリの場所」を知っていた場合、pどういうわけか " " を実行して with&p + 1の値を取得できますか?p[1]cout << *p

int *p;
p = new int[3];

p[0] = 13;
p[1] = 54;
p[2] = 42;
4

5 に答える 5

8

確かに、ポインターを操作して配列内のさまざまな要素にアクセスできますが、ポインター自体のアドレスではなく、ポインターの内容 (つまり、p が指しているアドレス) を操作する必要があります。

int *p = new int[3];
p[0] = 13;
p[1] = 54;
p[2] = 42;

cout << *p << ' ' << *(p+1) << ' ' << *(p+2);

各加算 (または減算) は、配列内の後続 (前) の要素を意味します。p がアドレス 12345 の 4 バイト変数 (典型的な 32 ビット PC のintなど) を指している場合、p+1 は 12346 ではなく 12349 を指します。それが指すものにアクセスします。

于 2008-09-20T05:49:02.930 に答える
3

そうではありません。ポインタ&pのアドレスです。は、さらに1 つ先のアドレスを参照します。あなたがしたいことはp&p+1int*

p=p+1; /* or ++p or p++ */

今あなたがするとき

cout << *p;

54 が得られます。違いは、ints の配列の開始アドレスがp含まれているのに対し、は pのアドレスです。1 つのアイテムを移動するには、int arrayをさらにポイントする必要があります。スタックに沿ってさらにポイントする必要はありません。&pp

持っているだけの場合&pは、次のことを行う必要があります。

int **q = &p; /* q now points to p */
*q = *q+1;
cout << *p;

私が間違っていなければ、54も出力されます。

于 2008-09-20T05:53:44.777 に答える
2

ポインターを扱ってからしばらく (何年も) 経ちましたが、p が配列の先頭 (つまり p[0]) を指していて、それをインクリメントした (つまり p++) 場合、p は p を指すようになることを知っています。 [1]。

値を取得するには、 p を逆参照する必要があると思います。ポインターの前に * を付けることで、ポインターを逆参照します。

したがって、p[0] を 33 に変更すると、*p = 33 になります。

2 番目の要素を取得するには *(p+1) を使用するので、必要な構文は次のようになると思います。

cout << *(p+1)

また

cout << *(++p)
于 2008-09-20T05:54:25.587 に答える
2

私はこれをするのが好きです:

&p[1]

私には、よりきれいに見えます。

于 2008-09-20T06:11:23.517 に答える
1

CおよびC++の「ポインタ型」は、CPUのメモリ空間のバイトに重ねられた非常に長い論理的なセルの行をバイト0から開始するものと考えてください。各セルの幅(バイト単位)は、ポインタの「タイプ」。各ポインタタイプは、セル幅が異なる行を配置します。intの"int *"ストレージ幅は4バイトであるため、ポインターは4バイトのセルの行を配置します。A"double *"は、セルごとに8バイトの行を配置します。"struct foo *"ポインタは、それが何であれ、各セルが単一の幅である行を配置します"struct foo"。任意の「thing」の「アドレス」は、「thing」を保持している行のセルの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バイト超えます。)

于 2008-09-20T07:02:01.993 に答える