c++ - 为什么我们在链表中设置pointer=nullpointer和pointer->next=nullpointer时会有不同的效果-C++
问题描述
我有以下代码片段(关于单链表) -
class Node
{
public:
int data;
Node* next;
};
Node* newNode(int data)
{
Node* temp = new Node;
temp->data = data;
temp->next = nullptr;
return temp;
}
int main()
{
Node* head = newNode(2);
head->next = newNode(4);
Node* p1 = head;
p1 = nullptr;
return 0;
}
在这里,head
和p1
是单独的变量 - 意味着单独的内存位置。所以,当我们这样做时p1=nullptr
,只p1
应该生效,而不是head
。而且,当我调试代码时会发生这种情况(如下图所示):
但是,当我执行 p1->next=nullptr 而不是 p1=nullptr 时,head 也会受到影响。如下图所示:
p1 和 head 是不同的内存位置。因此 p1=nullptr 不会影响 head。但是为什么 p1->next=nullptr 会影响头部呢?
p1 指向一个指针串,head 也指向一个指针串(p1->next->next->next... 和 head->next->next->next...)。p1 与 head 位于同一内存位置。而且 p1->next 和 head->next 也在同一个内存位置(在我们说 p1=head 之后),其他的 next 指针也是如此。那么,为什么将 p1 设置为 nullpointer(或任何其他值)不会影响 head。但是,设置 p1->next 到 nullptr,效果头?如果你能用方框图来回答我这里的内存是如何工作的,那将会很有帮助。谢谢!
解决方案
您误解了您在调试器中看到的内容。head
不受影响。
head
就其本身而言,唯一的就是内存地址。仅此而已,仅此而已。
在您的第二个示例中,head
mustve be 0x007ce390
before p1->next=nullptr
,并且在分配之后仍然是相同的确切内存地址。
你的调试器向你展示的不仅仅是指针本身,它指向的实际内存地址,还有指针引用的所有值。由于p1
和head
现在是同一个指针,因此设置p1->next=nullptr
也会更改指向的值head
,并且您的调试器会显示这一点。
但指针本身并没有改变。
推荐阅读
- android - Android Studio Admob 错误属性未知
- javascript - 将具有基于固定位置的模式的原始字符串数据转换为基于对象的结构,如 JSON
- angular-cli - 使用 Angular CLI 时出现类型错误 [ERR_NO_ICU]
- awk - 在 Bash 中协同工作的 OFS 和排序问题
- r - R中矩阵的乘法
- java - getSingleResult() 出错
- c# - 带有期望的 Linq:在此上下文中仅支持原始类型或枚举类型
- mysql - 使用多个 JOIN 对列进行计数和分组
- amazon-web-services - AWS Fargate 集群无法使用 NAT 和 Internet 网关访问 Internet
- java - 在二维数组中找到最小值时遇到问题