簡體   English   中英

C-單鏈表-按值與按引用傳遞指針

[英]C - Singly linked list - passing a pointer by value vs by reference

typedef struct node { int data; struct node *next; } NODE;

NODE* add_head(NODE **phead, int data) {
  NODE *new = (NODE *)malloc(sizeof(NODE));
  new->data = data;
  new->next = *phead;
  *phead = new;
  return new;
}

NODE* add_tail(NODE **phead, int data) {
  NODE *p, *new = (NODE *)malloc(sizeof(NODE));
  new->data = data;
  new->next = 0;
  if (*phead == 0) *phead = new;
  else
  {
    for (p = *phead; p->next; p = p->next);
    p->next = new;
  }
  return new;
}

我們在函數中有一個單鏈表,如上所示。 該節點由數據類型int和指向列表中下一個節點的指針組成。 我們定義了兩個函數。 第一個更改頭節點,或在前一個頭節點之前添加新的頭節點。 第二個函數添加尾節點(列表中的最后一個)。 總的來說,我們稱它們為:

NODE *head = 0;
NODE *c1 = add_head(&head, 1);
NODE *c2 = add_tail(&head, 3);

現在,看一下這個函數:

NODE* add_after(NODE *node, int data) {
  NODE *new = (NODE *)malloc(sizeof(NODE));
  new->data = data;

  new->next = node->next;
  node->next = new;

  return new;
}

該函數在參數節點之后添加一個節點。 而且,總的來說,如果我們想在先前定義的c1之后添加一個節點,我們可以像下面這樣調用該函數:

*c3 = add_after(c1, 4);

我的問題是:就參數而言,前兩個函數和第三個函數有什么區別? 在前兩個函數中,我們有一個參數** phead,在第三個函數中是* node。 我們真的需要** phead嗎,為什么我們不能只將* phead放在主調用中,如下所示:

NODE *c1 = add_head(head, 1);

希望您理解我的意思,我很難解釋。

  • 第一個元素(類型為NODE )的地址包含在指針(類型為NODE * )中

  • add_head()函數修改此指針。 當您使用C語言進行編程時,公然缺乏通過引用傳遞參數的方法,您唯一的選擇就是傳輸其地址。

因此,該參數的類型為NODE** (指向NODE的指針的地址)。

  • 對於add_after()該參數給出要修改的NODE的地址。 您不必修改該地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM