2

ここでのポインタの使用法に関して1つありますが、ここでは理解できませんCell *curr = head;が、アドレスをhead取得し、それをどのように処理しますか?

Cell *ConvertToListIter(Vector<int>& vector)
{
    Cell *head = new Cell;
    head->next = NULL;
    head->value = vector[0];
    Cell *curr = head;

    for (int i = 1; i < vector.size(); i++) {
        Cell *newCell = new Cell;
        newCell->next = NULL;
        newCell->value = vector[i];
        curr->next = newCell;
        newCell = curr;
    }

    return head;
}
4

2 に答える 2

5

Cell *curr = head;のアドレスを 取りませんhead-のを取りますhead。それがheadポインタであることが起こります。

Cell *head = new Cell;

したがって、Cell *curr = head;実行後、両方currhead同じことを指します。

コメントごとに編集:

それで、それらの1つを削除すると、両方に影響しますか?それらは、同じ値の2つのコピーではなく、メモリ内の同じアドレスを指しています。

そのとおりです。2つのポインタは、メモリ内の1つのオブジェクトを指します。deleteそのオブジェクトは一度だけ編集する必要があります。実際、2回試行するdeleteと未定義動作が発生し、プログラムがクラッシュすることがよくあります。

于 2012-12-21T20:00:57.377 に答える
1

ポインタはメモリアドレスを保持しているため、ポインタの値はメモリ内の場所です。ポインターで代入演算子を使用すると、そのポインターの値が別のポインターにコピーされます。したがって、新しいポインタは、最初のポインタが指していたのと同じメモリ位置を指します。

プライマリタイプのコピー割り当てを想像してみてください。

int i = 1;
int j = i;

との両方の値は1ijなります。これはポインタの場合にも当てはまります。したがって、コード

Cell *head = new Cell;
Cell *curr = head;

headとの両方currのアドレスになりnew Cellます。

于 2012-12-21T21:24:42.310 に答える