5

私は C++ を学んでいて、ポインターについて質問があります。

私はこのコードを持っています:

int* max = new int;
*max = 0;

ヒープ上にポインターを作成したと思います (正しくない場合は教えてください)。

一つの質問:

1 つの命令でポインタの初期化を作成する方法はありますか? (現在、2 つの命令を使用しています)。

別の質問:

スタック上にポインタを作成するにはどうすればよいですか?

次のようなコードが表示されます。

int myVar = 20;
int* pVar = &myVar;

スタックにポインターを作成していないと思いますが、ヒープにポインターを作成しない唯一の方法だと思います。

私は C++ 開発に関して非常に非常に新しいです。

4

5 に答える 5

11

ポインタは通常の変数で、その内容はメモリ アドレスです。このメモリは、ヒープ メモリまたはスタック メモリにすることができます。ポインターを、ポインターが指すメモリー空間と混同しないでください。

最初のコードは、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
于 2013-05-25T13:26:39.467 に答える
1

あなたの最初の例

int* max = new int;
*max = 0;

実際にヒープ上に新しい int を作成しており、変数maxはその int へのポインターを保存します。delete max;これを使用する場合は、メモリ リークを避けるために、不要になったときに使用する必要があります。

2番目の例

int myVar = 20;
int* pVar = &myVar;

スタック上に int を作成していますが、pVar現在は int がメモリに保存されているアドレスへのポインターです。ただし、これを使用している場合はpVar、ヒープ上にないため (newキーワードを使用していないため) を削除する必要はありません。

2 つの変数 (ヒープとスタックで作成) の主な違いは、スタック変数がスコープを離れると自動的に削除されることです。スコープは中括弧で定義されます{}:

int* somefnc()
{
    int e1

    {
        int* e2 = new int(0);
        int e3 = 0;
    } // int e3 gets automatically deleted here

    return e2;
} // e1 gets automatically deleted here

// e2 still exists and has to be manually deleted.

ポインターの利点の 1 つは、配列を扱う場合です。スタック上に x 要素の char 配列を作成する場合、コンパイル時に要素の数を知る必要があります。動的な数の要素を使用して実行時に x 要素の char 配列を作成する場合は、使用char* ar = new char[x];してから でアクセスする必要がありますar[x-1] = '\n';


変数をヒープ上に作成するときに変数を初期化するには、var x = new var(args);.

于 2013-05-25T13:36:13.847 に答える
0

値を引数として渡して、ヒープ内のメモリを初期化できます。

 int *iptr = new int(20);

値 20 で初期化されます。

stack: ローカル変数が含まれています。そのため、ポインターを作成してローカルオブジェクトに割り当てると。スタック内の変数を指しています。heap にポインターを作成していません。

于 2013-05-25T13:24:20.200 に答える