2

ptrポインターがあり、そのポインターにスペースを割り当てると仮定します。さて、別のポインターptr2があり、これを行うと:

ptr2 = ptr;

これは、スペースを割り当てるということですか、それとも自分ptr2で割り当てる必要がありptr2ますか?

4

5 に答える 5

4

まあ、「ポインタにスペースを割り当てる」という意味に依存します。

例えば:

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;

未定義の動作が発生します (違法です)。

(これはすべて最適化の対象ですが、原則として、このようになります)

于 2012-10-23T17:13:03.643 に答える
1

「ポインターにスペースを割り当てる」ことはありません。「スペースを割り当てる」だけで、そのスペースへのポインターがあります。あなたの場合、同じスペースへの2 つのポインター (ptrおよび) があるだけです。ptr2

于 2012-10-23T17:11:08.723 に答える
0

コンパイラは、プログラムで参照されるすべての変数にメモリを割り当てます。ポインタが一種の変数であるとしましょう。

したがって、ptr1とptr2に割り当てられたメモリがあります。

両方のポインタがNULLを指しています。

ptr          ptr2 
0x0        | 0x0

各ポインタは、値が格納されているメモリアドレスを指しています。

ptr          ptr2
0x0F032010 | 0x0C012A10

ptr2は、ptrと同じ値を指しているようになりました。ptr2によって指摘されたものはすべて失われます。

ptr          ptr2
0x0F032010 | 0x0F032010

あなたの質問に答えるために、ptr2 = ptrは、ptrが指す値のコピーを作成せず、変数ptr2がptrと同じ値にアクセスできるようにするだけです。

于 2012-10-23T17:52:02.610 に答える
0

ポインターは単純な変数のようなものですが、メモリ アドレスを格納するという違いがあります。そのため、考慮する必要がある 2 種類のスペース割り当てがあります。1 つは、ポインター変数自体が占めるスペースです。2 番目は、ポインターが指すスペースです。質問が言うように、

ポインターがptrあり、そのポインターにスペースを割り当てているとします。

2番目のケースについて話していると思います。

したがって、 を実行するとptr2 = ptr、 がptr2指すのと同じ空間を指しptrます。ただし、ポイントするアドレスを格納できるptr2にスペースが割り当てられています。

于 2012-10-23T17:12:29.917 に答える
0

ポインターは、変数または POD (int などのプレーンな古いデータ型) に似ていますが、メモリ アドレスを保持するという違いがあります。ある変数から別の変数にアドレスをコピー/割り当てるだけです。

于 2012-10-23T17:12:43.917 に答える