c语言 参数传递(x,y传的是地址啊,为什么a,b的值没有交换啊!)

#include"stdio.h"
void fun(int*a,int*b)
{int *k;
k=a;a=b;b=k
}
main()
{inta=1,b=2,*x=&a,*y=&b;
fun(x,y);
printf("%d%d",a,b);
}

原因如下:
X,Y的确是地址,也将a,b地址传递给了函数fun。
但是函数内部的作用是将参数a和b的内容交换,a和b的内容是main函数定义中x,y的值(也就是a,b的地址,注意main函数中a,b和形参定义的a,b是2个不同的定义,也就是说main中的a,b和fun中的a,b是2组不同的内存块。)接着说,fun的形参a,b的值虽然交换了,但是函数调用完以后,形参a,b的值都被free了,根本没有影响到main中a,b的值(刚才说了2个a,b都是不相同的)。

如果你对我上面的解释还感觉很茫然了,我将你的程序写在下面和我的程序对比
,这样可以或许对你有点帮助:
#include"stdio.h"
void fun(int*a,int*b) //这时候的内存块: a=1 地址2000
{int *k; b=2 地址2004
k=a;a=b;b=k x=2000 地址2008
y=2004 地址2012
形参变量(和main中d的a,b不一样) a=2000 地址2016
b=2004 地址2020
然后函数起作用后:形参a=2004 地址2016
b=2000 地址2020
最后释放 a,b,main函数中的a,b并没有因此改变
}
main()//程序从这里开始运行
{inta=1,b=2,*x=&a,*y=&b;// 这时候内存块是这样的: a=1 地址2000
fun(x,y);//调用函数fun ,请你看条用fun的时候的内存块 b=2 地址 2004
printf("%d%d",a,b); x=2000 地址2008
} y=2004 地址2012
下面是正确的做法:
正确的做法:
#include"stdio.h"
#include "stdlib.h"
void fun(int*a,int*b)
{int k;
k=*a;*a=*b;*b=k;
}
int main()
{int a=1,b=2,*x=&a,*y=&b;
fun(x,y);
printf("%d%d",a,b);
system("pause");
}
这样就改变了a,b的值
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-02-24
这是一道国二题
我也见过
你在这里里面
fun(x,y);
并不是把x,y进行运算
而是把x,y代表的&a,&b
赋给fun(int*a,int*b)
对a,b
进行操作
还不行
你就自己好好想想
只可意会
不可言传啊
第2个回答  2010-02-06
指针作函数的参数也是依照“单向传递”的方法,在你用卡交换的时候,只是交换了地址,并没有交换a与b的值,你如果输出的是指针,就可以达到你的效果了
第3个回答  2010-02-06
{int *k;
k=a;a=b;b=k
}
错了,应该是
{ int k;
k=*a;*a=*b;*b=k;
}
你定义的是指针,但是你用的不是指针。。。
第4个回答  2021-12-15
void fun(int *a,int*b)//a的值为2000,*a=1; b的值为2004,*b=2
{
int* t;
t = a;//t指向x,值为2000,*t=1;
a = b;//a指向y,值为2004,*a=2;
b = t;//b指向x,值为2000,*b=1;
printf("%d,%d", *a, *b);//只是将指针变量a,b的指向交换,并没有改变实参x,y
}
void main()
{
int x = 1, y = 2;
fun(&x, &y);//x值为1,地址为2000; y值为2,地址为2004
printf("x=%d,y=%d\n", x, y);
}