2

您好,我是 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
}

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

4

4 回答 4

2

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

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

change_by_add(&p);

请参阅C 常见问题解答问题 4.8

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

void add_to_int(int* a_value, int a_increment)
{
    *a_value += a_increment;
}
于 2014-04-25T11:23:12.737 回答
2

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

*ptr = y;

这会取消对指针的引用(暴露指向的值),因此当您使用等号运算符时,指向的内存会被修改,而不是指针本身。我希望这有助于澄清事情。

于 2014-04-25T11:23:42.610 回答
2

被调用函数所做的更改不会被调用者反映,因为您正在覆盖被调用函数中的指针地址,ptr = &y;.

最初,您传递了 的地址,x但您将其更改为 的地址y

如果您真的想实现按地址调用的概念,请更改 value 而不是 address

例子:

void change_by_add(int *ptr) {
    *ptr = y;  //changing value
    printf("\nInside change_by_add\t %d",*ptr);
}

void main(){
    int *p;
    p = &x;
    change_by_add(p);
    printf("\nInside main\t %d \n", *p);
    return 0;
}

输出

Inside change_by_add     20
Inside main  20
于 2019-10-07T03:07:16.280 回答
1

C 中没有按地址调用这样的东西。只有按值调用。当一个函数需要以一种对调用者可见的方式修改参数时,我们所做的就是让调用者传递一个指向某事物的指针,并让被调用函数通过该指针写入更新。请注意,指针本身仍以按值调用的形式发送 - 也就是说:被调用的函数获取自己的指针副本,并且可以将其更改为指向其他任何内容(如果需要)。

于 2014-04-25T11:27:00.117 回答