C 链表的打印功能是如何工作的?

C 链表的打印功能是如何工作的?,c,linked-list,C,Linked List,我将结构定义为: typedef struct node Node; struct node { char val; Node* tail; }; 我启动一个链接列表,如下所示: Node* header; Node node_one; node_one.val = 'a'; node_one.tail = 0; header = &node_one; 然后我继续向列表中添加节点。现在,当我对这个链表使用下面的打印功能时,它的工作方式与预期的工作方式相同: void prin

我将结构定义为:

typedef struct node Node;
struct node {
  char val;
  Node* tail;
};
我启动一个链接列表,如下所示:

Node* header;
Node node_one;
node_one.val = 'a';
node_one.tail = 0;
header = &node_one;
然后我继续向列表中添加节点。现在,当我对这个链表使用下面的打印功能时,它的工作方式与预期的工作方式相同:

void printlist(Node* header) {
    do{
        printf("%c ", header->val);
        header = header->tail; // aren't we modifying the header itself here?
    } while(header->tail!=0);

    printf("%c --> NULL", header->val);
}
main()
调用为
printlist(标题)


到目前为止还不错。我不明白的是,在不改变列表的情况下,当我第二次、第三次、第四次调用这个print函数时,它总是有效的。它打印列表中的元素。但是我所期望的是,这个函数只工作一次,因为我正在修改头指针本身,所以在运行这个打印函数一次之后,我不应该丢失内存中的列表吗?为什么它不止一次工作?

下面函数中的标题可能是一个局部变量(函数printlist的局部变量)。因此,您的原始标题(主标题中的标题)根本没有更改。因此,无论何时调用此函数,它仍在打印列表

void printlist(Node* header){
    do{
        printf("%c ", header->val);
        header = header->tail; // aren't we modifying the header itself here?
    }while(header->tail!=0);
    printf("%c --> NULL", header->val);
 }

这是因为在
printlist()
正文中使用的
标题
与在
main()中引用的标题
不同。这些变量与恰好具有相同名称的不同变量有关


您可以通过在
printlist()
中更改
标题的名称来尝试这一原理:例如调用它
mylist
,整个程序仍然可以运行

看看Binky Pointer Fun Video C++:是的,
header
不是全局变量,我在
main()
中声明的指针名为
header
。是这样吗?当我调用
printlist(标题)时它复制一个指针
标题
,复制该指针意味着副本指向与
标题
本身相同的位置。所以在
printlist()
中,我修改的不是
标题本身,而是它的副本?这就是为什么我能够一遍又一遍地运行那个函数?是的,没错!你说对了!我完全忽略了这样一个事实,即即使它是我传递给函数的指针,除非我传递它的地址,否则我只是传递一个副本。谢谢你们和珊塔努的回答。