【问题标题】:C++: Linked list and pointer funC++:链表和指针的乐趣
【发布时间】:2012-12-21 19:58:42
【问题描述】:

这里关于指针的使用有一件事我不明白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;
}

【问题讨论】:

  • curr 始终是指向列表中最后一个元素的指针,因此您可以轻松追加新节点。
  • @DanielFischer,或者至少应该是......这段代码中有一个错误。
  • @MarkRansom 当我扫视时它并不存在。真相。

标签: c++ pointers linked-list


【解决方案1】:

Cell *curr = head; 不采用head地址 -- 它采用head。碰巧head 是一个指针:

Cell *head = new Cell;

所以,Cell *curr = head; 执行后,currhead 都指向同一个东西。

编辑根据您的评论:

所以如果我删除其中一个,会影响两者吗?他们指向 内存中的相同地址,不是相同值的两个副本是吗?

没错。这两个指针指向内存中的单个对象。该对象只需deleteed 一次。事实上,尝试delete 两次会导致未定义的行为,并且经常会导致程序崩溃。

【讨论】:

  • 所以如果我删除其中一个会影响两者吗?它们指向内存中的相同地址,而不是相同值的两个副本是吗?
【解决方案2】:

指针持有一个内存地址,因此指针的值是内存中的一个位置。当您在指针上使用赋值运算符时,该指针的值将被复制到另一个指针中。因此,新指针将指向与第一个指针指向的内存位置相同的内存位置。

想象一下主要类型的复制分配:

int i = 1;
int j = i;

ij 的值都是 1。指针也是如此。所以代码

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

将导致headcurr 都指向new Cell 的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2013-03-07
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多