【问题标题】:How to handle pointer of LinkedList in c++如何在 C++ 中处理链表的指针
【发布时间】:2020-06-15 00:42:02
【问题描述】:

我是 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 中的指针,因为作为初学者,这很混乱。)

【问题讨论】:

    标签: c++


    【解决方案1】:

    tmpfor 循环中的局部变量。

    (*p)->next是链表节点中的next指针。

    (*p)->next = tmp; 将一个设置为另一个的值,但它们仍然是两个完全独立的实体。指向其中一个的指针在逻辑上不等同于指向另一个的指针。在这一点上,您可以将它们视为同卵双胞胎。他们看起来像。他们说话很像。但是将手指指向其中一个并不等同于将手指指向另一个。它们是各自独立的实体。更重要的是:

    p = &tmp; - 这会将p 设置为指向tmp

    立即销毁。这是循环中的一个局部变量,一旦循环结束,这个变量就会被销毁,即使循环再次迭代。

    之后尝试访问此对象是未定义的行为,这将导致in demons flying out of your nose。除非你喜欢恶魔从你的鼻子里飞出来,否则你不应该那样做。

    【讨论】:

    • 我还是不明白为什么(*p)->next = tmp 仍然是两个独立的实体,所以这里的tmp应该是指向这个Node的指针,而分配一个指向另一个指针的指针不应该使它们两者兼有指向同一个对象?
    • 它们指向同一个对象,好吧,但是tmp(*p)->next本身是两个完全不同的实体;所以p = &tmpp = &(*p)->next 最终将p 设置为指向不同的 实体。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2021-10-17
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多