1

この質問が以前に尋ねられたかどうかはわかりません (SOF を検索しても答えが見つかりませんでした)

LinkedList クラスとそれを逆にする関数を書きました。関数は次のように、

    struct LinkedList::element* LinkedList::recurrsiveReverseList(element* head){
     element* tempList;
     if(head->next == NULL){
        return head;
     }else{
        tempList = recurrsiveReverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return tempList;        
    }
   }

ここでは、ローカル ポインター変数を宣言し、それに変更を加えて呼び出し元に返しています。C++ では、関数内でローカル変数を宣言すると、スコープは関数内にのみ存在します。関数からポインターを返すと、どのように機能しますか? 私はロジックを理解して結果を得ることができます (幸いなことに) が、ここでの作業を完全に理解することはできません。

誰かが私の疑いを晴らすことができますか?

4

5 に答える 5

2

関数を終了するとスコープはtempList終了しますが、は間違いなくによって割り当てられているため、スコープがそこで終了しないtempListメモリブロックへのポインタです。このように割り当てられたメモリは、出入りする関数の数に関係なく、その時点まで有効です。newdelete

ポインタを呼び出し元に戻すことにより、ポインタを使用できる他の場所にそのポインタを保持します。

簡単な例:

static char *fn (void) {
    char *rv = new char[42];
    return rv;
}

int main (void) {
    char *x = fn();
    delete [] x;
    return 0;
}

上記のコードでは、のスコープは宣言された後の関数にrv限定されています。fn

のスコープは、宣言された後xの関数に限定されます。main

ただし、によって割り当てられたメモリnewは内に存在し、に戻った後も存在しfn続けますmain。に最初に格納されたメモリのアドレスは、に戻り値を割り当てることによってにrv転送されます。xfnx

于 2011-08-23T03:39:51.003 に答える
2

他の誰かがこのように説明したかどうかはわかりませんが、ポインター自体は、0x12345678 のような数字にすぎません。その番号は、探している実際の値を含むコンピューターのメモリ内の位置をアドレス指定します。これがリンク リスト ノードです。

したがって、そのアドレスを返すとき、元の変数が破棄されても問題ありません。番地を別の紙にコピーして、元の紙を捨てるようなものです。あなたが持っている住所にある家はまだそこにあります.

于 2011-08-23T03:47:32.350 に答える
1

関数を終了すると、ポインタオブジェクトtempListは存在しなくなります。しかし、それは大丈夫です。オブジェクト自体ではなく、オブジェクトに格納された(のコピー)を返します。まるで

int n = 42;
return n;

(ローカル変数のアドレスを返すことはあなたを困らせるものです。)

于 2011-08-23T03:41:09.297 に答える
0

tempList変数の使用範囲は、ローカルとしてメソッド内に制限されていますが、返されるメモリアドレスを保持しています。それを呼び出すコードは、変数tempListではなく、このメモリアドレスを受け取ります。

于 2011-08-23T03:40:14.443 に答える