#includevoidfun1(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);输出1010fun3(x,y);printf("%d%d",*x,*y);//输出2010return0;}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()函数为什么就改变了呢?*/
2 回答
潇湘沐
TA贡献1816条经验 获得超6个赞
指针本质上是一个代表地址的整数,用于寻址,强制类型转换确实可以赋值给整型。但是并不是所谓的地址调换,所以是你对指针的理解错误了。你这样在整型和指针之间乱转类型,尤其直接把拿int的值去寻址,八成都改了不知道哪里的内存了。吐槽下你的编译器:1.一个(int型的a)居然可以被赋值给一个(指针temp)而不用显示强制类型转换。2.居然可以把一个(int型的a)直接*a就当作指针用。
德玛西亚99
TA贡献1770条经验 获得超3个赞
严格的说法,在c中你无法改变实参,因为c中传递参数是通过复制来传递的,由main函数到被调函数的过程中实参和行参已经完全没有了关系,除了值相同之外之前就回答过你了,fun1中的行参a以及b和main中的x以及y除了指向相同的地址之外没有任何的关系,你对调了ab不会对x和y产生任何影响,也不会对i和j产生影响而你所理解的能改变实参,指的是通过指针可以改变指向变量的值(毕竟指针就是干这个的!),无论指针(被调函数(fun1fun2fun3)中的ab以及main中的xy)在哪里,只要指向的地方相同都能访问到那个指向的变量(i以及j),即通过*a或者*x就能改变i的值!fun2是错误的写法
添加回答
举报
0/150
提交
取消