我很难理解传递给函数的指针。这里有一个struct指针,该指针被传递给函数,并且该指针会增加一些值,并且不会反映在指针变量中。我猜这是按值调用,但是如何?你能解释一下吗?
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
}node;
void change_addr(node *ptr){
ptr += 10;
printf("Inside Address : %p\n",ptr);
}
int main(){
node x = {100};
printf("Address : %p\n",x);
change_addr(&x);
printf("Address : %p\n",x);
return 7;
}
答案 0 :(得分:1)
您将结构的地址传递给函数。此参数在函数内递增,并且不能从外部访问。类似于如果在函数中传递和整数并将其递增,将会发生的情况。如果要递增data
,则需要通过传递给函数的指针进行访问。例如node->data = 0;
等效于(*node).data = 0;
。
&node
是节点结构的地址。在写入返回地址并跳转到函数之前,将此参数压入调用堆栈。请参阅C calling convention的说明。 change_addr()
现在可以读写此值,而main()
从未看到过该值,因为在完成change_addr()
之后,它会从堆栈中弹出。
答案 1 :(得分:1)
声明
node x = { 100 };
为节点结构分配内存,并将其初始化。声明
change_addr(&x);
获取该结构的内存地址,该地址只是一个数字,例如1000,然后按值 将其传递给change_addr()函数。在该函数内,您将100%添加到名为ptr
的指针的您的本地副本中,这使其指向的内存区域远远超出x所在的位置(如果x曾经是一个数组而不是单个结构,它将指向第101个元素)。然后返回,丢弃该地址的本地副本,并返回到x从未修改过的初始堆栈帧。
在change_addr()函数内部,您可以通过指针访问结构来更改其 content 。例如,ptr->data = 200
将更改其数据。但是,如果由于某种原因要更改指针地址本身,则必须创建指向该指针的指针,并将其传递给采用适当参数类型的函数。