为什么这个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