ポインタは通常の変数で、その内容はメモリ アドレスです。このメモリは、ヒープ メモリまたはスタック メモリにすることができます。ポインターを、ポインターが指すメモリー空間と混同しないでください。
最初のコードは、int を保持できるヒープにスペースを割り当てます。そのメモリへのポインタをスタックに格納します。
2 番目のコードは、int を保持できるスタックにスペースを割り当てます。そのメモリへのポインタをスタックに格納します。
したがって、両方のポインターがスタック上にありますが、スタックを指すのは 2 番目のポインターだけです。
どちらの場合も、割り当てる型はプリミティブ型です。プリミティブ型は、すぐに値を割り当てる (2 番目のコード) か、ヒープ割り当て値でも機能するコンストラクター構文を使用しない限り、既定では初期化されません。
int *max = new int(0);
ちなみに、2 番目のコードでも同じ構文を使用できます。
int myVar(20);
興味がある場合: ヒープにポインターを定義することもできます。int*
は s へのポインターの型int
なので、先に進んでそのような型をヒープに割り当てます。
new int*();
この式は を返しますint**
。これをどこかに保存できます。繰り返しますが、通常、このポインターツーポインターをスタックに格納します。
int **pointerToPointer = new int*();
s と同様に、new 式の an を int へのポインター (ここでは上記のポインター)にint
初期化できます。int*
max
int **pointerToPointer = new int*(max);
これで、同じアドレスを持つ2 つのポインターmax
があります: (スタック上のポインター) と、使用することを指すヒープ上のポインターpointerToPointer
、つまり、次の保持 (`pointerToPointer を逆参照します。これにより、このポインターの背後に格納されている値が導かれます。 int へのポインター):
max == *pointerToPointer