为什么这个C函数什么都不做?

为什么这个C函数什么都不做?,c,function,output,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上赋值?C函数的参数总是按值传递。为

我有这个功能:

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
上赋值?

C函数的参数总是按值传递。为了启用按引用传递行为,可以按值传递指针。然后可以取消对这些指针的引用,以访问函数外部的值

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);
int a = 3, b = 4;
change(&a, b);
x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2020
int **y OR &q = 2021
虽然这样做有效,但仍不太理想。我们只更改
x
所指向的值。通过
y
指向的值被传递为未更改的值。因此,我们可以保存该间接寻址并按值传递y:

void change(int *x, int y){
  *x = y;
}
正如你现在所能猜到的,它是这样使用的:

int a = 2, b = 3;
change(&a, &b);
int a = 3, b = 4;
change(&a, b);
x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2020
int **y OR &q = 2021

C函数的参数总是按值传递。为了启用按引用传递行为,可以按值传递指针。然后可以取消对这些指针的引用,以访问函数外部的值

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);
int a = 3, b = 4;
change(&a, b);
x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2020
int **y OR &q = 2021
虽然这样做有效,但仍不太理想。我们只更改
x
所指向的值。通过
y
指向的值被传递为未更改的值。因此,我们可以保存该间接寻址并按值传递y:

void change(int *x, int y){
  *x = y;
}
正如你现在所能猜到的,它是这样使用的:

int a = 2, b = 3;
change(&a, &b);
int a = 3, b = 4;
change(&a, b);
x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2020
int **y OR &q = 2021

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

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

在函数中,您只需更改副本。 试试这个

#包括
#包括
无效更改(整数**x,整数**y){
**x=**y;
}
内部主(空){
int x=10,y=15;
int*p=&x;
int*q=&y;
变化(p&p&q);
printf(“%d%d”,x,y);
返回0;
}

在函数中,您只需更改副本。 试试这个

#包括
#包括
无效更改(整数**x,整数**y){
**x=**y;
}
内部主(空){
int x=10,y=15;
int*p=&x;
int*q=&y;
变化(p&p&q);
printf(“%d%d”,x,y);
返回0;
}

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

int a = 2, b = 3;
change(&a, &b);
int a = 3, b = 4;
change(&a, b);
x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2020
int **y OR &q = 2021
现在您所做的是&p=&q,它只是将int**x的值更改为2021。但2015年和2016年的位置价值保持不变

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

这与原始
x
y
的值无关,假设变量x存储在2015位置,y存储在2016位置。现在,该指针分别存储在位置2020和2021中。 因此,调用函数时,更改值如下所示:

int a = 2, b = 3;
change(&a, &b);
int a = 3, b = 4;
change(&a, b);
x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2020
int **y OR &q = 2021
现在您所做的是&p=&q,它只是将int**x的值更改为2021。但2015年和2016年的位置价值保持不变

x = 10
y = 15
p = 2015
q = 2016
int **x OR &p = 2021
int **y OR &q = 2021
这与原始
x
y

的值无关,让我们举一个例子:

int x = 10 , y = 15;
int *p = &x;
int *q = &y;
假设
&x
表示内存地址100,
&y
表示内存地址104。 然后根据您的程序,
p
将有100个地址,
q
将有104个地址指向。 请原谅我还有一个假设:)
p
q
也将有一些内存地址。 因此,假设
&p
表示内存地址200,
&q
表示内存地址204

change(&p, &q);

void change(int **x, int **y){
x = y;
}
现在这里
x
将指向
&p
y
将指向
&q
。 现在使用
x=y
将使x指向y,即
x
y
都指向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;
}让我们举个例子:

int x = 10 , y = 15;
int *p = &x;
int *q = &y;
假设
&x
表示内存地址100,
&y
表示内存地址104。 然后根据您的程序,
p
将有100个地址,
q
将有104个地址指向。 请原谅我还有一个假设:)
p
q
也将有一些内存地址。 因此,假设
&p
表示内存地址200,
&q
表示内存地址204

change(&p, &q);

void change(int **x, int **y){
x = y;
}
现在这里
x
将指向
&p
y
将指向
&q
。 现在使用
x=y
将使x指向y,即
x
y
都指向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;

}

您发送的是p和q的地址,而不是x和y的地址。使用
void change(int*x,int*y)
代替,并且
*x=*y
x=y
你好,谢谢你的回复,但我只是想问一下。。我知道我正在传递和地址,但那个地址也指向一些有价值的地址。。。该值是否假定与指针一起出现?您必须取消对指针的引用以获得该值。如果需要,您可以保留代码并将
x=y
更改为
**x=**y
like@NoobProgrammer你找到问题的答案了吗?如果是这样,你应该考虑把最适合你的答案标记为“接受”。你发送的地址是P和Q,而不是X和Y。使用
void change(int*x,int*y)
ins