3

MIT の Introduction to C++ を読んでいたところ、コード例の 1 つが次のように示されていました。

int *getPtrToFive() {
    int *x = new int;
    *x = 5;
    return x;
}

int main() {
    int *p;
    for (int i = 0; i < 3; ++i) {
        p = getPtrToFive();
        cout << *p << endl;
        delete p;
    }
}

ループが開始される前に「p」が一度宣言され、「new」を使用して割り当てられなかったにもかかわらず、繰り返しごとに「p」を削除できるのはなぜだろうかと思っていました。

別の質問は、関数で "*x" に値 5 が割り当てられた場合です。これはポインタであるため、メモリ アドレスが正しく変更されるのでしょうか。つまり、実際の値 5 ではなく 0x00005 のようなものでしょうか?

4

2 に答える 2

6

ループが開始される前に「p」が一度宣言され、「new」を使用して割り当てられなかったにもかかわらず、繰り返しごとに「p」を削除できるのはなぜだろうと思っていました。

いいえ。 を削除するのではなく、各反復を使用して割り当てられるオブジェクト p が指す をp削除します。new

別の質問は、関数で "*x" に値 5 が割り当てられた場合です。これはポインターであるため、メモリ アドレスが正しく変更されるのでしょうか。つまり、実際の値 5 ではなく 0x00005 のようなものでしょうか?

の値はx0xFFd00whatever のようなものになります。しかし、*x「アドレス0xFFd00whateverのメモリにある数値」の値を出力しています。x=5あなたのコードにはありません。しかありません*x=5。「xが指しているアドレスに行き5、そこに数字を入れる」という意味です。

このように考えることができます。あなたには手がありますね。「×」としましょう。コマンド

x = new int;

「机の上の空いている場所を指さす」という意味です。どこ

*x = 5;

「手が指すところに5を引く」という意味です。

于 2013-06-23T18:51:45.267 に答える
2

pは単に型の変数int*(へのポインタint) です。その値はアドレスです。新しい値を割り当てると、新しいオブジェクトを指します。 deleteアドレスが必要です。割り当てたメモリの割り当てを解除するために必要なのはそれだけです。

上記のアドレスを格納するために使用される変数は無関係です。そのは変更されました。それがすべてdeleteです。値。

于 2013-06-23T18:52:16.993 に答える