实现交换,输出数据,一个是调用函数实现,一个没有用,但是一个交换了,一个没有交换,为什么?

JohhGan 2009-01-20 01:52:53
#include <stdio.h>
void swap(int *x ,int *y)
{
int *temp;
temp=x;
x=y;
y=temp;
}
void main()
{
int a=3,b=5,*p=&a,*q=&b;

swap(p,q);
printf("%d %d\n",*p,*q);
}
上面的这个没有交换3和5的值:输出的仍是:3 5
#include <stdio.h>
void main()
{
int a=3,b=5;
int *p,*q,*temp;
p=&a,q=&b;
temp=p;
p=q;
q=temp;
printf("%d %d\n",*p,*q);
}
这个交换了:输出的是:5 3
...全文
187 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
JohhGan 2009-01-20
  • 打赏
  • 举报
回复
谢谢了!~O(∩_∩)O哈哈~
xiaoyisnail 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 ganyue803 的回复:]
3楼的代码:指针指向的a,b内容交换,所以输出交换了~
temp=x;
x=y;
y=temp;
这个是修改指针本身~
12楼说不能修改指针本身
[/Quote]

函数里修改的只是形参,而因为你是按值传参,形参只是实参的副本,函数里修改形参跟实参没有关系,函数外的实参从头到尾没有改变
waizqfor 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ganyue803 的回复:]
引用 19 楼 waizqfor 的回复:
引用 16 楼 ganyue803 的回复:
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;

应该说是只是把指针的指向做点小改动 在函数里是有效 你可以在函数里 写个输出检验一下 不过出了函数 基本就是没有做任何改动

或者说是在函数里面改动了,出来就没有传递成功!
只能是地址传递才成功,其他的传递都不成功~
所以就没有改动了,只是在函数里面改动了~
[/Quote]
恩 上道了 呵呵
waizqfor 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ganyue803 的回复:]
引用 19 楼 waizqfor 的回复:
引用 16 楼 ganyue803 的回复:
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;

应该说是只是把指针的指向做点小改动 在函数里是有效 你可以在函数里 写个输出检验一下 不过出了函数 基本就是没有做任何改动


哦,在函数里面:稍微修改了一下指针。在函数外面:又变回来了?
[/Quote]
恩 是的 LZ这东西 你好好看看 函数传递参数的方式 你就知道 值传递跟引用传递的区别了 咱这么说 你只能知道个大概 还是看书加实践一下 就能立刻理解
JohhGan 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 waizqfor 的回复:]
引用 16 楼 ganyue803 的回复:
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;

应该说是只是把指针的指向做点小改动 在函数里是有效 你可以在函数里 写个输出检验一下 不过出了函数 基本就是没有做任何改动
[/Quote]
或者说是在函数里面改动了,出来就没有传递成功!
只能是地址传递才成功,其他的传递都不成功~
所以就没有改动了,只是在函数里面改动了~
JohhGan 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 waizqfor 的回复:]
引用 16 楼 ganyue803 的回复:
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;

应该说是只是把指针的指向做点小改动 在函数里是有效 你可以在函数里 写个输出检验一下 不过出了函数 基本就是没有做任何改动
[/Quote]

哦,在函数里面:稍微修改了一下指针。在函数外面:又变回来了?
JohhGan 2009-01-20
  • 打赏
  • 举报
回复
3楼的代码:指针指向的a,b内容交换,所以输出交换了~
temp=x;
x=y;
y=temp;
这个是修改指针本身~
12楼说不能修改指针本身
waizqfor 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ganyue803 的回复:]
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;
[/Quote]
应该说是只是把指针的指向做点小改动 在函数里是有效 你可以在函数里 写个输出检验一下 不过出了函数 基本就是没有做任何改动
waizqfor 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ganyue803 的回复:]
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;
[/Quote]
应该说是只是把指针的指向做点小改动 在函数里是有效 你可以在函数里 写个输出检验一下 不过出了函数 基本就是没有做任何改动
tanmeining 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ganyue803 的回复:]
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;
[/Quote]
先理解3楼的代码吧,和你的第一种的写法有什么区别,然后再说说你的理解,我们再继续...
JohhGan 2009-01-20
  • 打赏
  • 举报
回复
那就是说:
temp=x;
x=y;
y=temp;
没做任何事?执行后,还是
&x->a &y->b;
waizqfor 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ganyue803 的回复:]
修改了形参的指针值,不就使得a与b所指向的对象发生了变化?
前:&x->a a=3 &y->b; b=5
后:&y->a a=3 &y->b; b=5
那么就会交换值??可是没有交换!~
[/Quote]
LZ 用函数调用来解决问题 跟你在main中解决是不一样的 函数调用要求你的参数传递 的形式是值传递啊 还是引用啊 达到的效果都不同
xiaoyisnail 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ganyue803 的回复:]
修改了形参的指针值,不就使得a与b所指向的对象发生了变化?
前:&x->a  &y->b;
后:&y->b  &y->a;
那么就会交换值??可是没有交换!~
[/Quote]

你是按值传递传参的,函数里只能修改指针指向的值,不能修改指针本身,所以实参是不变的
你先理解一下三楼的代码
JohhGan 2009-01-20
  • 打赏
  • 举报
回复
修改了形参的指针值,不就使得a与b所指向的对象发生了变化?
前:&x->a a=3 &y->b; b=5
后:&y->a a=3 &y->b; b=5
那么就会交换值??可是没有交换!~
JohhGan 2009-01-20
  • 打赏
  • 举报
回复
修改了形参的指针值,不就使得a与b所指向的对象发生了变化?
前:&x->a &y->b;
后:&y->b &y->a;
那么就会交换值??可是没有交换!~
waizqfor 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaoyisnail 的回复:]
引用 8 楼 nullah 的回复:
这个问题看来不是月经贴了 是周帖

ms这次的稍有区别
[/Quote]
xiaoyisnail 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nullah 的回复:]
这个问题看来不是月经贴了 是周帖
[/Quote]
ms这次的稍有区别
xiaoyisnail 2009-01-20
  • 打赏
  • 举报
回复
楼主传的就是地址
nullah 2009-01-20
  • 打赏
  • 举报
回复
这个问题看来不是月经贴了 是周帖
xiaoyisnail 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yellowhwb 的回复:]
引用 3 楼 xiaoyisnail 的回复:
swap函数中你修改的是形参指针的值,却没有修改指针指向的对象的值
应该如下:
C/C++ code

#include <stdio.h>

void swap(int *x ,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}

void main()
{
int a=3,b=5,*p=&a,*q=&b;

swap(p,q);
printf("%d %d\n",*p,*q);
}

传值和传址要区分一下的!
[/Quote]

楼主的情况下不需要,请仔细看楼主的调用方式
加载更多回复(6)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧