如何在函数内部传递单个指针到结构并修改该结构变量?

时间:2015-07-01 13:57:28

标签: c pointers structure singly-linked-list

在下面的代码中,我能够从函数中修改main中使用的变量。

#include<stdio.h>

    int main()
    {
      int *a,b=10;
      a = &b;
      printf("%d\n",*a);
      ref(a);
      printf("%d\n",*a);
      return 1;
    }

    int ref(int *a)
    {
       int b = 98;
       *a = b;
       return 1;
    }

然而,在下面的代码中,我无法做同样的事情。

我知道我们可以通过使用双指针从函数修改main中的值。我也知道我们可以使用单个指针进行修改,方法是将所需的地址返回给main,并使用相同的数据类型将其输入main。我只想知道是否可以通过将其作为参数传递给函数来修改main中的值,仅作为指向(结构)变量的单个指针。

注意:我用评论'// WC'表示了工作代码。如果有人能解释我一样,我将非常感激。

  //int insert(int data, Node **head) //WC
    int insert(int data, Node *head)
    {
       Node *temp, *run;
       temp = (Node *) malloc(sizeof(Node));
       temp->data = data;
       temp->next = NULL;

       //if(*head == NULL) //WC
       if(head == NULL)
       {  
          printf("1st node\n");
          //*head = temp; //WC
          *head = *temp;
       }
       else
       {
          printf("node after first\n");
          //run = *head //WC
          *run = *head;
          while(run->next != NULL)
          {
             run = run->next;
          }
          run->next = temp;
       }

       return 1;
    }
    int main()
    {
       Node *head;
       insert(10, head);
       insert(20, head);
       insert(30, head);
       insert(40, head);
       insert(50, head);

       return 1;
    }

2 个答案:

答案 0 :(得分:2)

当您检查head是否为空(具有NULL值)时,您需要检查head(* head)的内容,而不是head本身,因为这意味着它自己的地址。所以if(head == NULL),应该是* head == Null。 head表示指针头的内存地址,* head表示在该地址中保存的内容(指向的内容)。有了这个逻辑,* head = temp;是正确的,因为它将保存动态分配的内存地址的地址-temp在头部但是后一个(* head = * temp)将尝试将temp的内容复制/保存到head,这是没有意义的,因为head is只有一个指针的大小,temp可以分配节点的大小。我希望我至少帮助了一下,这是你的代码的工作版本:))

int insert(int data, Node **head) //WC, This is correct because the parameter **head takes address of the pointer to the first node if any. 
//int insert(int data, Node *head)
{
   Node *temp, *run;
   temp = (Node *) malloc(sizeof(Node));
   temp->data = data;
   temp->next = NULL;

   if(*head == NULL) //WC, checking if head has any address value inside (not its own address)
   {  
      printf("1st node\n");
      *head = temp; //WC, because temp has address of the allocated memory and you wanna hold that address as the head / first node.
   }
   else
   {
      printf("node after first\n");
      run = *head //WC
      //*run = *head; you can't use this, one reason is because head could point to any size of memory (e.g 10000kb) and run has a size of a pointer, just few bytes.  
      while(run->next != NULL)
      {
         run = run->next;
      }
      run->next = temp;
   }

   return 1;
}

(编辑:使用多指针可能会使阅读变得复杂,所以我宁愿使用以下结构定义)

typedef struct node* PNode; //Pointer to node
typedef struct node {
    int item;
    Pnode next;
} Node;

void insert(int data, PNode *head) {
    PNode temp, run = *head;
    temp = (PNode)malloc(sizeof(Node));
    temp->data = data;
    temp->next = NULL;
    if (run == NULL){
        *head = temp;
    }//first node
    else{
        while (1) {
            if (run->next == NULL) {
                run->next = temp;
                break;
            }
            run = run->next;
        }
    }
}

答案 1 :(得分:1)

  

如何将单个指针传递给函数内部的结构并修改该结构变量?

TL; DR:您可以修改指针指向的,但不能修改传递的指针本身。

C使用pass-by-value进行函数参数传递。您不能从被调用函数更改接收参数的,并期望它在用作调用函数的参数的变量中 reflect

但是,如果是指针,通常不会修改指针本身,而是修改它指向的。因此,该指针指向的更改值将在调用函数中反映