鱼C论坛

 找回密码
 立即注册
查看: 4111|回复: 7

关于两个值的互换~求教

[复制链接]
发表于 2011-10-1 12:20:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 回首、往事 于 2011-10-1 14:10 编辑

void huhuan1(int * p, int * q)
{
int  t;
t = *p;
*p = *q;
*q = t;
}
int main(void)
{
int a=3;
int b=5;
    huhuan1(&a, &b);
printf("a=%d\nb=%d\n",a,b);
return 0;
}
#include <stdio.h>
void huhuan2(int * p, int * q)
{
int * t;
t=p;
p=q;
q=t;
}
int main(void)
{
int a=3;
int b=5;
    huhuan2( &a, &b);
printf("%d,%d",a,b);
return 0;
}
#include <stdio.h>
void huhuan3(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
int main(void)
{
int x,y;
scanf("%d%d",&x,&y);
huhuan3(x,y);
    printf("x = %d,y = %d", x , y);

return 0;
}
//为什么只有第一个程序能将两个值互换~~后两个不行!!
请详细解释每个程序不能互换的原因

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-1 13:19:50 | 显示全部楼层
函数是单向传值,指针也不例外,,
   但是你可以改变指针也指向的值,,

第二个程序改变的是指针的值,就像你传给形参一个 红色盒子(指针),你想把 红色盒子(指针)里面的东东(值)怎么换都可以,就是不能把  红色盒子(指针)给换成白色的,实参只认红色盒子,,其它的它不理,但你把它里面的 东西 (指针指向的值) 怎么换都行,,
比喻的不是很好见谅了!!
第三个程序改变的是变量的值,你交换的只是   void huhuan3(int a,int b)函数体内的内容,,主调函数还是原来的值,,不会改变,,

第一个程序你交换的是指针指向的值,所以也就实现了a和b的互换,,


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-1 13:22:08 | 显示全部楼层

那我再问下~什么叫 函数是单向传值 不懂....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-1 13:35:41 | 显示全部楼层
回首、往事 发表于 2011-10-1 13:22
那我再问下~什么叫 函数是单向传值 不懂....

实参不会因形参的值的改变而改变

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-1 14:09:42 | 显示全部楼层
明白了~~感谢各位的回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-6 01:55:13 | 显示全部楼层
本帖最后由 ZPCG 于 2011-10-6 01:56 编辑

这样就明白了?,有点不大信,当楼主在3楼再度提问什么是单向传值的时候,我就想楼主可能没能看懂2楼解释的关键点.没想到4楼那个书面而且不到点的回答,楼主竟然就在5楼明白了,实在太奇怪了.我前几个月纠结这个问题了几个星期,后来几次都以为自己明白了,但碰到后面的越来越复杂的指针应用时,每次都觉得还是不很彻底地明白.我现在都还不敢肯定到底明白了没有.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-6 16:03:08 | 显示全部楼层
ZPCG 发表于 2011-10-6 01:55
这样就明白了?,有点不大信,当楼主在3楼再度提问什么是单向传值的时候,我就想楼主可能没能看懂2楼解释的关键 ...

实际上这问题~~我在好多地方同时提过!!综合一下就明白了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-12 15:02:45 | 显示全部楼层
#include <stdio.h>
void huhuan3(int a,int b)// 在互换3中,你紧紧交换的是形参A,B的值
//也就是交换的是实参的一个副本,而没有交换实参的值 
{
int t;
t=a;
a=b;
b=t;
}
int main(void)
{
int x,y;
scanf("%d%d",&x,&y);
huhuan3(x,y);
    printf("x = %d,y = %d", x , y);

return 0;
} 
#include <stdio.h>
void huhuan2(int * p, int * q)
{
int * t;
t=p;
p=q;
q=t;   //这里实现交换的是p,q的值 也就是a,和b的地址,所以你输出的时候 
// 如果你将下面的输出 改成输出 b,a的地址所指向的值 就可以看到 
}
int main(void)
{
int a=3;
int b=5;
    huhuan2( &a, &b);//这里进行的是地址传递,传递的是A 和b的地址 
printf("%d,%d\n",a,b);
int *p,*q;
p=&a;
q=&b;

printf("%d %d",*q,*p);//也就是这里
return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-9 13:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表