传递地址,但它的工作方式类似于C中的值?

您好,我是C编程语言的初学者。 最近我读到了关于价值的呼叫和地址呼叫。 我已经了解到,在通过地址调用时,被调用函数的变化反映了被调用者。 但是,以下代码不起作用。

int x = 10,y = 20; void change_by_add(int *ptr) { ptr = &y; printf("\n Inside change_by_add\t %d",*ptr); // here *ptr is printing 20 } void main(){ int *p; p = &x; change_by_add(p); printf("\nInside main\t %d", *p); // here *p is still pointing to address of x and printing 10 } 

当我传递地址时,为什么被调用函数所做的更改不会反映调用者?

该函数为指针分配一个新地址,但指针本身正在按值传递,因为所有参数都在C中。要更改指针变量的值,必须传递指针本身的地址:

 void change_by_add(int **ptr) { *ptr = &y; } change_by_add(&p); 

见C FAQ问题4.8 。

C中不存在通过引用传递,但可以通过将要更改的值的变量的地址传递给函数来实现。 例如:

 void add_to_int(int* a_value, int a_increment) { *a_value += a_increment; } 

您只是在函数中设置指针的值,而不是指向变量的值。 该函数应使用以下代码:

* ptr = y;

这解除了指针(暴露指向的值),因此当你使用equals运算符时,指向的内存被修改,而不是指针本身。 我希望这有助于澄清事情。

在C中没有地址呼叫这样的东西。只有按值呼叫。 当函数需要以调用者可见的方式修改参数时,如果让调用者传递指向某个东西的指针,并让被调用的函数通过该指针写入更新,那么该怎么办。 请注意,指针本身仍然是按值调用发送的 – 即:被调用函数获取自己的指针副本,如果需要,可以将其更改为指向其他任何内容。