链表函数 cpp 中的指针作用域


struct Entry {
    std::string name, phone;
    Entry *next;
};
Entry * getNewEntry() {
    std::cout << "Enter name (RETURN to quit): ";
    std::string name;
    std::getline(std::cin, name);
    if (name == "") return NULL;
    Entry *newOne = new Entry; //allocates a new entry struct obj in the heap
    newOne->name = name;
    std::cout << "Enter phone number: ";
    std::string number;
    std::getline(std::cin, number);
    newOne->phone = number;
    newOne->next = NULL; //in this function pointer to next entry is NULL
    return newOne;
}
void prepend(Entry *ent, Entry *first) {
    ent->next = first;
    *first = *ent;
}
Entry * buildAddressBook() {
    Entry *listHead = NULL;
    while (true) {
        Entry *newOne = getNewEntry();
        if (!newOne) break;
        prepend(newOne, listHead);
    }
    return listHead;
}

为什么在prepend()中不工作这一行?

*first = *ent;

我知道我可以先通过引用传递并让它工作,但是如果我首先引用并将其设置为等于 ent 指向的结构,为什么这不起作用?即使指针变量是按值传递的,它们仍然指向相同的结构?

*first = *ent所做的是将ent指向的字节的数据字节复制到first指向的位置,在您的示例中,该位置将为NULL,并可能导致seg错误。

首先需要的是指向指针 (*&( 的引用或指向指针 (**( 的指针,以便可以在外部函数中更改指针。

出于您的目的,我建议参考,因为它更容易阅读。

所以前面应该是(请注意,我已经删除了相等行上的 deref(:

void prepend(Entry *ent, Entry *&first) {
    ent->next = first;
    first = ent;
}

*指针表示地址 = 指针处的值。由于指针当前指向垃圾,因此会出现 seg 错误。

您不能首先取消引用"first",因为 first 指向内存中很可能不属于您的程序自己的位置。

相关内容

  • 没有找到相关文章

最新更新