我有一个链接列表,其中最后一个节点指向NULL,并且有一个函数通过遍历while循环中的列表来打印元素。我上传了我的来源,但它很长,所以我会简化它。
struct xrec{
*some elements*
struct xrec *next;
};
typedef struct xrec EMPLOYEE;
void listEmployee(EMPLOYEE * list){ // list is head node
int i = 0;
while (list != NULL){
printf(*%d. print elements..*, i+1);
list = list->next; // point to next structure
i++;
}
}
我可以根据需要多次调用该函数,因为我将它设置在do-while循环中的switch语句中。但是在第一次调用之后,我的头节点是否指向NULL?因此,我再也无法打印出这些元素,对吧?但是,每当我调用该函数时,情况并非如此;它总是回到第一个节点。这是为什么?我非常确定在调用函数后我从未将列表重定向回第一个节点。
答案 0 :(得分:4)
函数的参数是其局部变量。那就是他们(他们的价值观)是争论的副本。所以在这个宣言中
void listEmployee(EMPLOYEE * list);
list是函数的本地varaibel。函数内参数的任何更改都不会影响函数调用的参数(及其值)。
你可以想象函数调用方式如下
EMPLOYEE * head;
//...
listEmployee( head );
//...
void listEmployee( /* EMPLOYEE * list */ )
{
EMPLOYEE * list = head;
//...
因此,在函数中,它的局部变量list
将被更改。 head
将保持不变,因为它未在函数中使用。
答案 1 :(得分:2)
list
变量是指向节点的指针;并在遍历列表时更改此指针。所以,当你走到尽头时,list
已不复存在了。
但是你改变的变量不是你作为函数参数传入的变量。当您调用该函数时,您传递的指针将被复制到新变量list
中;它的副本会被更改,而不是原始副本。原文保持不变。
可能值得查看按值传递和按引用传递之间的区别。这里,指针正在按值传递。它有点令人困惑,因为指针实际上是一个引用......但它是一个值正在传递的引用。