C 函数调用后指针会发生什么变化

C 函数调用后指针会发生什么变化,c,pointers,linked-list,function-pointers,C,Pointers,Linked List,Function Pointers,当一个指针结构指向另一个已分配内存的结构时,函数调用后会发生什么?我之前问了一个关于结构的问题,这让我提出了这个问题: 例如: struct example{ //variables and pointers struct clip *next; }*Head void insert_at_end(){ //We have a pointer cp that goes through the linked list, initially cp->next points to `null

当一个指针结构指向另一个已分配内存的结构时,函数调用后会发生什么?我之前问了一个关于结构的问题,这让我提出了这个问题:

例如:

struct example{
//variables and pointers
struct clip *next;
}*Head
void insert_at_end(){
//We have a pointer cp that goes through the linked list, initially cp->next points to `null so we create a newnode right away`
//struct example cp and newnode gets malloc'd here

if(Head != NULL){
cp=Head;
while(cp->next !=NULL){
cp=cp->next;
}
cp->next=newNode;
else{

//We link the head to the newNode `because we don't want to change the head for each new node added.`
head=newNode;
}
}
然后我在函数中有一个数据类型为struct的指针:

struct example *newNode=malloc(sizeof(struct example));
在相同的功能中,我将第一个节点(头部)链接到第二个节点(新节点):

函数退出后,链接/指向是否仍然有效?我不确定这是否有意义,但当您在linkedlist的末尾添加新节点时,您必须首先查看linkedlist的结尾(next pointer=NULL)

例如:

struct example{
//variables and pointers
struct clip *next;
}*Head
void insert_at_end(){
//We have a pointer cp that goes through the linked list, initially cp->next points to `null so we create a newnode right away`
//struct example cp and newnode gets malloc'd here

if(Head != NULL){
cp=Head;
while(cp->next !=NULL){
cp=cp->next;
}
cp->next=newNode;
else{

//We link the head to the newNode `because we don't want to change the head for each new node added.`
head=newNode;
}
}
但是,在列表末尾添加每个新节点之后,我们将退出该函数。那么,当我们重新进入该函数并通过linkedlist查看其结束位置时,会发生什么情况?它如何知道cp->下一步指向什么

在列表末尾添加的每个新节点我们都会退出函数,那又怎样 当我们重新进入函数并通过linkedlist访问 看到它在哪里结束了吗

您的
newnode
将添加到列表的末尾。此指针是列表的一部分,不是函数的本地指针。因此,当您重新输入函数时,先前添加的节点仍然存在

它如何知道cp->下一步指向什么

当位置存储在列表中时,它知道该点的位置


在动态分配中,分配的内存保持分配状态,直到显式删除为止。因此,数据的存在与指针或函数无关

在列表末尾添加的每个新节点我们都会退出函数,那又怎样 当我们重新进入函数并通过linkedlist访问 看到它在哪里结束了吗

您的
newnode
将添加到列表的末尾。此指针是列表的一部分,不是函数的本地指针。因此,当您重新输入函数时,先前添加的节点仍然存在

它如何知道cp->下一步指向什么

当位置存储在列表中时,它知道该点的位置



在动态分配中,分配的内存保持分配状态,直到显式删除为止。因此,数据的存在与指针或函数无关。

您应该记住的一点是指针始终是按引用传递的,而不是按值传递的。 因此,只要您没有释放指针所持有的内存,它们就会保持不变(注意这一点)。因此,在重新输入函数时,始终可以引用已添加到链表中的节点


但是,当程序退出或不需要时,您应该释放所有分配的指针。

您应该记住的一点是,指针始终是按引用传递的,而不是按值传递的。 因此,只要您没有释放指针所持有的内存,它们就会保持不变(注意这一点)。因此,在重新输入函数时,始终可以引用已添加到链表中的节点


但是,当程序退出或不需要时,您应该释放所有分配的指针。

对其进行编码,使用所有警告和调试信息(例如,Linux上的gcc-Wall-g)编译它,并逐步使用调试器(gdbLinux上)显示相关指针,以找到答案。在黑板上写下正在发生的事情。阅读几本好的C编程书籍。您需要了解堆是什么,以及
malloc
free
在做什么。这并没有真正的帮助。我知道我的问题的措辞可能不是最好的,但本质上我问这个问题是因为我不知道函数退出后指针会发生什么,所以我无法把它画出来。特别是当cp->next指向下一个节点的内存位置时,它是否会在函数存在后以某种方式保存?否则,我们还可以如何处理linkedlist?对它进行编码,使用所有警告和调试信息(例如,Linux上的gcc-Wall-g)编译它,并逐步使用调试器(Linux上的gdb),显示相关指针,以找到答案。在黑板上写下正在发生的事情。阅读几本好的C编程书籍。您需要了解堆是什么,以及
malloc
free
在做什么。这并没有真正的帮助。我知道我的问题的措辞可能不是最好的,但本质上我问这个问题是因为我不知道函数退出后指针会发生什么,所以我无法把它画出来。特别是当cp->next指向下一个节点的内存位置时,它是否会在函数存在后以某种方式保存?否则我们怎么能通过linkedlist呢?哦,nvm,我明白了,当我们通过linkedlist时,我们设置cp指针指向第一个、第二个、第三个等节点,所以当我们在列表中的最后一个节点时,cp->next就像说lastnode->next一样。那么这是否意味着我们实际使用的是lastnode的下一个指针,还是cp的下一个指针指向next的最后一个节点?哦,nvm,我明白了,当我们浏览linkedlist时,我们将cp指针设置为指向第一个、第二个、第三个,当我们在列表中的最后一个节点时,cp->next就像说lastnode->next。那么,这是否意味着我们实际使用的是lastnode的下一个指针,还是cp的下一个指针指向next的最后一个节点?