[英]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.