PointerToPointer:如何将修改后的值/结构返回到原始列表?

时间:2014-05-27 08:14:25

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

在为链接列表编写添加功能时,我想出了以下代码

    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

现在,只要我对指针指针的理解,当我调用此函数时

  

ADDNODE(安培; n)的

(n定义为node * n)我发送指针n的地址。 head =& n截至目前?在1,我使ptr指向n,即ptr =& n?是对的吗?我不明白的是为什么我需要设置* head = ptr?是不是已经直接对n进行了更改?并且ptr和* head都不指向n?

谢谢!

2 个答案:

答案 0 :(得分:1)

ptr是* head的工作副本。与

node *ptr = *head;
你正在制作副本。如果使用ptr,则不会对head进行任何更改,因为您已经复制了指针而没有复制ptrptr。 head与n相同,它只是函数中n的名称。所以ptr不会改变n - 你使用行

*head = ptr;

改变n。

答案 1 :(得分:0)

如果您想在开头添加节点,可以这样做:

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;
    }
}