ptr
ポインターがあり、そのポインターにスペースを割り当てると仮定します。さて、別のポインターptr2
があり、これを行うと:
ptr2 = ptr;
これは、スペースを割り当てるということですか、それとも自分ptr2
で割り当てる必要がありptr2
ますか?
ptr
ポインターがあり、そのポインターにスペースを割り当てると仮定します。さて、別のポインターptr2
があり、これを行うと:
ptr2 = ptr;
これは、スペースを割り当てるということですか、それとも自分ptr2
で割り当てる必要がありptr2
ますか?
まあ、「ポインタにスペースを割り当てる」という意味に依存します。
例えば:
int* ptr;
自動メモリにポインタ用のスペースを割り当てます。ただし、ポインターは意味のあるものを指していません。あなたがした場合:
int* ptr = new int;
new int
ポインタ自体のために自動メモリに割り当てられたスペースがあり、そのポインタは動的メモリにあるによって割り当てられたメモリを指します。
今あなたがした場合:
int* ptr2 = ptr;
自動メモリにptr2
それ自体のメモリがいくらかありますが、動的メモリの同じ場所を指しますptr
.
最終的に、int*
自動ストレージに2 秒間int
、動的ストレージに 1 秒間のメモリを割り当てたことになります。2 つのポインタは同じメモリを指しています。
自動メモリは自動的にクリーンアップされます(当然)。動的に割り当てられたメモリを自分で削除する必要があります。
delete ptr;
この 2 つは同じ場所を指しているため、次の点に注意してください。
delete ptr;
delete ptr2;
未定義の動作が発生します (違法です)。
(これはすべて最適化の対象ですが、原則として、このようになります)
「ポインターにスペースを割り当てる」ことはありません。「スペースを割り当てる」だけで、そのスペースへのポインターがあります。あなたの場合、同じスペースへの2 つのポインター (ptr
および) があるだけです。ptr2
コンパイラは、プログラムで参照されるすべての変数にメモリを割り当てます。ポインタが一種の変数であるとしましょう。
したがって、ptr1とptr2に割り当てられたメモリがあります。
両方のポインタがNULLを指しています。
ptr ptr2
0x0 | 0x0
各ポインタは、値が格納されているメモリアドレスを指しています。
ptr ptr2
0x0F032010 | 0x0C012A10
ptr2は、ptrと同じ値を指しているようになりました。ptr2によって指摘されたものはすべて失われます。
ptr ptr2
0x0F032010 | 0x0F032010
あなたの質問に答えるために、ptr2 = ptrは、ptrが指す値のコピーを作成せず、変数ptr2がptrと同じ値にアクセスできるようにするだけです。
ポインターは単純な変数のようなものですが、メモリ アドレスを格納するという違いがあります。そのため、考慮する必要がある 2 種類のスペース割り当てがあります。1 つは、ポインター変数自体が占めるスペースです。2 番目は、ポインターが指すスペースです。質問が言うように、
ポインターが
ptr
あり、そのポインターにスペースを割り当てているとします。
2番目のケースについて話していると思います。
したがって、 を実行するとptr2 = ptr
、 がptr2
指すのと同じ空間を指しptr
ます。ただし、ポイントするアドレスを格納できるptr2にスペースが割り当てられています。
ポインターは、変数または POD (int などのプレーンな古いデータ型) に似ていますが、メモリ アドレスを保持するという違いがあります。ある変数から別の変数にアドレスをコピー/割り当てるだけです。