3

C++ では、スタック上で単純な変数にメモリ アドレスが割り当てられるため、ポインタを使用してこのメ​​モリを格納し、それを指すことができます。ポインタにもメモリアドレスが割り当てられていますか?

はいの場合、ポインターのポインターを取得できますか?

4

3 に答える 3

15

はい、あなたは正しいです。ポインタへのポインタを持つことができます:

int a;
int b;
int * pa = &a;
int ** ppa = &pa;

// set a to 10
**ppa = 10;

// set pa so it points to b. and then set b to 11.
*ppa = &b;
**ppa = 11;

右から左に読んでください: ppa は int へのポインターへのポインターです。に限りません**。必要な数のレベルを持つことができます。int へのポインターへのポインターへint ***のポインターになります。

ここで、プリミティブ変数にアドレスがあるかどうかに関する同様の質問に答えました。 プリミティブにはメモリアドレスが割り当てられていますか? 、同じことがポインターにも当てはまります。つまり、オブジェクトのアドレスを取得しない場合、コンパイラはそれにアドレスを割り当てる必要はありません。その値をレジスタに保持できます。

于 2008-11-30T21:36:19.190 に答える
12

はい、ポインターへのポインター (またはポインターへのポインターへのポインター) を持つことができます。また、必要に応じて、ポインターもメモリ内のアドレスに格納されます。

ただし、すべてのスタック変数と同様に、必要がないと判断できる場合、コンパイラはメモリへのデータの書き込みを自由に回避できます。変数のアドレスを取得せず、現在のスコープより長く存続する必要がない場合、コンパイラは値をレジスタに保持するだけです。

于 2008-11-30T21:36:55.880 に答える
2

ポインタは、他の変数のアドレスを格納する単なる変数(メモリ位置)です。もちろん、それ自体のアドレスは別の場所に保存できます。

于 2008-12-01T19:05:38.727 に答える