c语言中,这个语句是什么意思啊?

void swap(int*a,int*b)
{
int t,*tp;
tp = a;a = b;b = tp; //交换的不是形参a,b的值吗??这时a=7,b=3??
t = *a;*a = *b;*b = t; //这次交换的是实参i,j的值,所以i=7,j=3?
printf("%d,%d,",*a,*b);//打印的*a*b不是7,3吗?
}
main()
{
int i = 3,j = 7,*p = &i,*q = &j;
swap(p,q);
printf("%d,%d,%d,%d",i,j,*p,*q);
}
注释是我的理解,我也知道错的。很不明白这个加*和不加*交换值时的区别。越详细越好,越简化理解越好!非常感谢!

tp = a;a = b;b = tp是交换了ab的指向,不影响主函数,t = *a;*a = *b;*b = t是改变了地址上的值,也就是把i和j的值互换。
所以函数中*a*b的输出对应是j=3,i=7,主函数输出ij这个没什么好说的,*p和*q还是ij的值。追问

说实话不理解。交换了ab的指向是什么意思?那,t = *a;*a = *b;*b = t改变了地址上的值,把i,j互换了 那打印*a*b时不就是打印互换了的i,j 就是 7 3吗?

追答

本来a指向i,b指向j,现在交换之后本来a指向j,b指向i,这就是ab指向交换。

追问

tp = a;a = b;b = tp; //所以交换了指向后,也更改下行的取值吗?
t = *a;*a = *b;*b = t; //*a = *b = i ?

追答

不是,函数两个交换,一个交换只是交换ab指向,另一个是交换这两个指针对应的变量的值

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-03-20
1)加*交换的是地址,会改变主函数中i和j的值,swap交换的是i和j的地址
2)不加*,不会改变i,j的值,i和j把自己的数值传递给swap函数中形参a,b,其交换的是a,b的值,对i和j无影响。
4) 总结:相当于你在main函数里申请一个变量int i,它在swap函数里是没有这个变量i的,它们只在自己的函数里有效。也就是说,交换的值只在swap函数里有效,如果不用指针*的话交换,这时你也可以把swap函数返回值void改为int(即把i和j交换后的值返回到主函数)
5)对与你上面的注释:注释是对的,那两种交换都会改变swap函数里的a,b值,但申请的中间变量指针交换后不会改变i和j的值。中间变量一般不会使用指针,因为没有赋初值的指针是野指针,它会乱指地址导致结果出错,参数a,b指针接收了main函数中的值本回答被提问者采纳
第2个回答  2020-08-08
相似回答