【发布时间】:2020-05-13 05:09:26
【问题描述】:
我知道指针保存变量的地址。并且引用指向符号表中的相同地址(即,它们被分配到的变量的相同地址)。
我的问题是,对指针的引用究竟是如何工作的。我们什么时候需要它们,而不是单独使用指针(而不是使用对指针的引用)。如果您能向我解释相对于单链表使用对指针的引用,那将会很有帮助。
我有以下代码使用函数删除链表的头指针:
struct Node
{
int data;
Node* next;
};
struct Node* newNode(int data)
{
Node* temp = new Node;
temp->data = data;
temp->next = nullptr;
return temp;
}
Node* deleteHead(Node* &head)
{
if (head)
{
Node* temp = head;
head = head->next;
delete temp;
}
return head;
}
int main()
{
Node* head = newNode(1);
head->next = newNode(6);
head->next->next = newNode(4);
head->next->next->next = newNode(8);
head = deleteHead(head);
Node* temp = head;
while (temp != nullptr)
{
cout << temp->data << " " << endl;
temp = temp->next;
}
return 0;
}
在deleteHead(Node* &head) 函数中,该函数接受参数Node* &head。但是,代码工作正常,即使参数是Node* head。在什么情况下我们需要在链表中传递Node* & 而不是Node*?
下面是上面的deleteHead(Node* &head)函数,如果我们只使用Node* head作为参数,而不是Node* &head-
【问题讨论】:
-
head = deleteHead(head);有效,但没有参考deleteHead(head);不会。归根结底,指针只是另一个变量(该值恰好是一个地址),如果您想更改该变量的值并使更改粘在函数之外,则需要通过引用传递变量。 -
“对指针的引用在 C++ 中是如何工作的”它的工作方式与对任何其他类型的变量的工作方式完全相同
-
附带说明,您所做的看起来很像链表的 C 实现。 C++™ 的奇妙魔法触手可及——创建一个
List类并将所有Node逻辑封装在其中,这样您的列表用户就不必担心任何问题! -
您真的需要参与到链表中来了解何时使用对指针的引用吗?像这样简单的事情呢?
void foo(int *x) { x = new int;} int main() { int *p=nullptr; foo(p); }-- 请注意,在调用foo之后,p仍然是nullptr。为什么?你是怎么解决的?
标签: c++ pointers pass-by-reference singly-linked-list