我有这个功能:
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
?
答案 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
这与原始x
或y
的值无关。
答案 3 :(得分:1)
让我们举个例子:
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;
}
答案 4 :(得分:0)
int ** x,int ** y只是双指针的声明。 现在x和y将包含指针p和q的地址。 ** x = ** y应该有效。