Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链表及&;参照_C_Pass By Reference_Singly Linked List - Fatal编程技术网

C 链表及&;参照

C 链表及&;参照,c,pass-by-reference,singly-linked-list,C,Pass By Reference,Singly Linked List,嗨,我是C语言的初学者,你能解释一下为什么我在给定的prev_节点后插入一个新节点时不需要引用调用吗(我更改了prev节点,我更改了prev->next,所以我需要引用调用) 但是,当我在列表的开头或结尾插入新节点时,我需要双指针(为什么只有当我将head作为参数时,我才需要通过引用调用) push()和append()需要修改传入的节点*指针本身。他们正在将新的节点对象的内存地址分配给传递的节点*。因此,您需要通过指针传入节点*,以便修改可以反映回调用方。例如: struct Node*hea

嗨,我是C语言的初学者,你能解释一下为什么我在给定的prev_节点后插入一个新节点时不需要引用调用吗(我更改了prev节点,我更改了prev->next,所以我需要引用调用) 但是,当我在列表的开头或结尾插入新节点时,我需要双指针(为什么只有当我将head作为参数时,我才需要通过引用调用)

push()
append()
需要修改传入的
节点*
指针本身。他们正在将新的
节点
对象的内存地址分配给传递的
节点*
。因此,您需要通过指针传入
节点*
,以便修改可以反映回调用方。例如:

struct Node*head=NULL;
推送(头和头,12345);
//头部指向新节点。。。
如果调用方的
节点*
通过值传递,则不会更新该
节点*
,例如:

struct Node*head=NULL;
推(头,12345);
//head仍然为空,并且新节点泄漏!

insertAfter()
不需要修改传入的
节点*
指针本身。它只修改所指向的
节点
对象的内容(特别是
节点
下一个
字段)。
节点*
指针本身没有被更改为指向不同的
节点
对象,它将一直指向它开始时的同一
节点
,因此它可以通过值传递。

您需要通过引用传递一个对象,以便在函数中更改它本身。否则,函数将处理传递对象的副本

在所有函数示例中,您都传递一个可以通过引用更改的对象

在函数push和append中,您通过引用传递指向可能在函数中更改的head节点的指针

在函数
insertAfter
中,通过引用传递当前节点旁边的对象(数据成员)

void insertAfter(struct Node* prev_node, int new_data)
                 ^^^^^^^^^^^^^^^^^^^^^^
因此,取消对指针的引用可以更改下一个对象,该对象是指向节点的数据成员

prev_node->next = new_node;

“通过引用调用”是一个不适用于C的高级语言概念。所有函数参数都是按值传递的——只是其中一些值是内存地址,您可以对它们进行反引用以访问它们所指向的内容。您能再解释一下吗?因为在修改上节点(最后一行prev_node->next如果我不通过引用传递,该更改将如何反映给调用方?您正在修改
节点
对象的成员,您没有修改指向该
节点
对象的
节点*
指针。这是有区别的。因此,传递该
节点*
指针是安全的r按值插入
insertAfter()
,因为
节点*
本身没有被更改为指向不同的
节点
对象,就像
push()
append()一样
节点
下一个
字段正在修改。退出时,传递的
节点*
将继续指向输入时开始的相同
节点。
prev_node->next = new_node;