猿问

用指针作为变量什么时候可以改变实参

#include
voidfun1(int*a,int*b);
voidfun2(int*a,int*b);
voidfun3(int*a,int*b);
intmain()
{
inti=10,j=20,*x=&i,*y=&j;
//fun1(x,y);printf("%d%d",*x,*y);输出1020
//fun2(x,y);printf("%d%d",*x,*y);输出1010
fun3(x,y);printf("%d%d",*x,*y);//输出2010
return0;
}
voidfun1(int*a,int*b)
{
int*temp;
temp=a;
a=b;
b=temp;
}
voidfun2(int*a,int*b)
{
int*temp;
*temp=*a;
*a=*b;
*b=*temp;
}
voidfun3(int*a,int*b)
{
inttemp;
temp=*a;
*a=*b;
*b=temp;
}
/*(1)对与第一个fun1()函数
为什么他们的值没有发生改变呢?我的理解是,fun()函数中
是a,b的地址调换了应该是改变了值才对应该是2010,但是
他们没有改变。
(2)对与第二个fun2()函数
*temp,*a,*b他们是指针变量所指向的值发生变化,应该不会影响实参i,j吧
但是和我想的不一样。
(3)对与第三个fun3()函数
为什么就改变了呢?
*/
Qyouu
浏览 662回答 2
2回答

潇湘沐

指针本质上是一个代表地址的整数,用于寻址,强制类型转换确实可以赋值给整型。但是并不是所谓的地址调换,所以是你对指针的理解错误了。你这样在整型和指针之间乱转类型,尤其直接把拿int的值去寻址,八成都改了不知道哪里的内存了。吐槽下你的编译器:1.一个(int型的a)居然可以被赋值给一个(指针temp)而不用显示强制类型转换。2.居然可以把一个(int型的a)直接*a就当作指针用。

德玛西亚99

严格的说法,在c中你无法改变实参,因为c中传递参数是通过复制来传递的,由main函数到被调函数的过程中实参和行参已经完全没有了关系,除了值相同之外之前就回答过你了,fun1中的行参a以及b和main中的x以及y除了指向相同的地址之外没有任何的关系,你对调了ab不会对x和y产生任何影响,也不会对i和j产生影响而你所理解的能改变实参,指的是通过指针可以改变指向变量的值(毕竟指针就是干这个的!),无论指针(被调函数(fun1fun2fun3)中的ab以及main中的xy)在哪里,只要指向的地方相同都能访问到那个指向的变量(i以及j),即通过*a或者*x就能改变i的值!fun2是错误的写法
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答