我是C ++的新手,所以这是我要解决的实践问题。所以我打算将一个int逐位放入一个链表,这是我写的:
ListNode* listtest() {
int i = 1234567;
ListNode* head = NULL;
ListNode** p = &head;
while (i != 0) {
int a = i % 10;
ListNode* tmp = new ListNode(a);
if (head == NULL) {
head = tmp;
}
else {
(*p)->next = tmp;
p = &tmp;
}
i = i / 10;
}
return head;
}
因此事实证明,这将输出一个链表,而下一个是它本身。但是,当我将p = &tmp
更改为p = &(*p)->next
后,效果很好。据我所知,这两行代码都将指针p
更改为p
之后的下一个节点。结果如何如此不同?
((还有任何推荐的文章或视频,我可以阅读以学习如何处理LinkList中的指针,作为初学者,这非常令人困惑。)
[tmp
是for
循环中的局部变量。
[(*p)->next
是链接列表节点中的next
指针。
(*p)->next = tmp;
将一个设置为另一个的值,但是它们仍然是两个完全独立的实体。指向其中一个的指针在逻辑上不等同于指向另一个的指针。此时,您可以将它们视为同卵双胞胎。他们看起来像。他们说话都一样。但是,将手指指向其中一个并不等同于将手指指向另一个。它们是各自独立的实体。更重要的是:
[p = &tmp;
-将p
设置为指向tmp
。
立即被销毁。这是循环中的局部变量,循环结束后,即使循环再次迭代,此变量也会被销毁。
之后尝试访问此对象是未定义的行为,将导致in demons flying out of your nose。除非您喜欢恶魔从鼻子里飞出来,否则您不应该那样做。