为什么这个C函数没有做任何事情?

时间:2015-03-31 03:40:07

标签: c function output

我有这个功能:

void change(int **x, int **y){
    x = y;
}

int main(void){

    int x = 10 , y = 15;
    int *p = &x;
    int *q = &y;

    change(&p, &q);

    printf("%d %d", x, y);

    return 0;

}

它仍然输出相同的值。 为什么y未分配x

5 个答案:

答案 0 :(得分:4)

C函数的参数始终按值传递。为了启用pass-by-reference行为,可以按值传递指针。然后可以取消引用这些指针以访问函数外部的值。

void change(int **x, int **y){
  x = y;
}

在这里,您要将y的值分配给x,虽然有效但不是您想要的:您希望指向值更改,而不是它的本地副本。一个间接层也足够了。因此将其更改为:

void change(int *x, int *y){
  *x = *y;
}

使用如下:

int a = 2, b = 3;
change(&a, &b);

虽然这有效,但它仍然不是最理想的。我们只更改x指向的值。 y指向的值无需更改即可传递。所以我们可以保存那个间接并通过值传递y:

void change(int *x, int y){
  *x = y;
}

正如您希望现在可以猜到的那样,这样:

int a = 3, b = 4;
change(&a, b);

答案 1 :(得分:1)

在您的功能中,您只需更改副本。 试试这个

#include <stdio.h>
#include <stdlib.h>
void change(int **x, int **y){
    **x = **y;
}

int main(void){

    int x = 10 , y = 15;
    int *p = &x;
    int *q = &y;

    change(&p, &q);

    printf("%d %d", x, y);

    return 0;

}

答案 2 :(得分:1)

假设您在2015年存储了变量x,并且2016年存储了y。现在,这些指针分别存储在位置2020和2021中。 因此,当您调用函数时,更改值如下所示:

x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2020
int **y OR &q = 2021

现在你所做的就像&amp; p =&amp; q,这只是将int ** x的值改为2021,但2015和2016年的位置值保持不变。

x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2021
int **y OR &q = 2021

这与原始xy的值无关。

答案 3 :(得分:1)

让我们举个例子:

int x = 10 , y = 15;
int *p = &x;
int *q = &y;

假设&x表示存储器地址100,&y表示存储器地址104。 然后根据您的计划p将有100个,q将有104个地址指向。 原谅我再多一个假设:) pq也将拥有一些内存地址。 因此,假设&p表示存储器地址200,&q表示存储器地址204。

change(&p, &q);

void change(int **x, int **y){
x = y;
}

现在,x将指向&py将指向&q。 现在使用x=y将使x指向y,即xy都指向204内存地址,这无论如何都无法更改x的值(x在以下函数代码段中为= 10)和y(y = 15)。

int main(void){

int x = 10 , y = 15;
int *p = &x;
int *q = &y;

change(&p, &q);

printf("%d %d", x, y);

return 0;

}

答案 4 :(得分:0)

int ** x,int ** y只是双指针的声明。 现在x和y将包含指针p和q的地址。 ** x = ** y应该有效。