【问题标题】:PointerToPointer : How to return the modified values/structure back to the original list?PointerToPointer:如何将修改后的值/结构返回到原始列表?
【发布时间】:2014-05-27 08:14:24
【问题描述】:

在为链表编写添加函数时,我想到了以下代码

    int addNode(node ** head)
        {
1.      node * ptr = *head;
        if(ptr==NULL)
        {
            ptr = (node *)malloc(sizeof(node));
            ptr->next = NULL;
            ptr->val = (char *)malloc(10);
            strcpy(ptr->val,"1");
2.          *head = ptr;
        }//Rest omitted

现在就我对指针指针的理解而言,当我调用这个函数时

添加节点(&n)

(n 定义为 node * n) 我发送指针 n 的地址。头 = &n 到现在为止?在 1 处,我将 ptr 指向 n,即 ptr = &n?那正确吗?我不明白为什么我需要设置 *head = ptr? ptr 不是已经直接对 n 进行更改了吗?而且 ptr 和 *head 不都指向 n 吗?

谢谢!

【问题讨论】:

    标签: c pointers memory-management linked-list pointer-to-pointer


    【解决方案1】:

    ptr 是 *head 的工作副本。与

    node *ptr = *head;
    

    你复制一份。如果您使用 ptr,则不会更改 head,因为您复制了指针但没有复制 ptrptr。 head 与 n 相同,只是函数中 n 的名称。所以 ptr 不会改变 n - 你使用这条线

    *head = ptr;
    

    改变n。

    【讨论】:

      【解决方案2】:

      如果你想在开始时添加你的节点,你可以这样做:

      int     addNode(node **head)
      {
        node  *ptr;
      
        if ((ptr = malloc(sizeof(*ptr))) != NULL)
          {
            ptr->val = (char *)malloc(10);
            strcpy(ptr->val,"1");
            ptr->next = *head;
            *head = ptr;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 2012-11-17
        • 2021-12-30
        • 1970-01-01
        • 2023-01-03
        • 2013-06-12
        • 1970-01-01
        相关资源
        最近更新 更多