鱼C论坛

 找回密码
 立即注册
查看: 1843|回复: 9

精华帖 三个数比较大小问题

[复制链接]
发表于 2016-1-23 06:30:19 | 显示全部楼层 |阅读模式
1鱼币
三个数比较大小,源码1和源码2一个成功一个失败
源码1     运行正常,但无法交换,失败。
#include<stdio.h>
void swap(int m,int n);       //交换
void main()
{
      int a,b,c;
      scanf("%d%d%d",&a,&b,&c);
      if(a<b)
            swap(a,b);                       //如果a<b,交换。
      if(a<c)
            swap(a,c);                       //同上。
      if(b<c)
            swap(b,c);                       //同上
      printf("%d>%d>%d\n",a,b,c);
}

void swap(int m,int n)          // 交换
{
      int t;
      t=m;
      m=n;
      n=t;
}


源码2     成功。
#include<stdio.h>
void swap(int *m,int *n);            //交换,与1相比变成指针型
void main()
{
      int a,b,c;
      int *p1,*p2,*p3;                    //定义指针
      scanf("%d%d%d",&a,&b,&c);
      p1=&a;
      p2=&b;
      p3=&c;
      if(a<b)
            swap(p1,p2);                        //如果a<b,交换
      if(a<c)
            swap(p1,p3);                        // 同上
      if(b<c)
            swap(p2,p3);                        //同上
      printf("%d>%d>%d\n",a,b,c);
}

void swap(int *m,int *n)
{
      int t;         //以第一个a<b为例
      t=*m;          //t=a;
      *m=*n;         //a=b;
      *n=t;          //b=t;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-24 20:27:25 | 显示全部楼层
源码1是   传值引用   调用函数时,会copy产生他们的副本 并将副本传给函数,函数改变的是副本的值,调用结束返回时,副本被销毁

源码2是   传指针引用  调用函数时,会将实参的地址传过去, 故函数可以直接改变该地址的值,故可以真正改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-27 15:45:12 | 显示全部楼层
再接再厉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-9 21:57:44 | 显示全部楼层
楼上已经回答了,源码1是传值,源码2是传址。
具体来说源码1的参数m和n在调用时实际上做了下面的事情
if(a<b){调用函数(m=a,n=b)},在函数里面是已经交换了的,可是在main()中a还是a,b还是b,所以你看不到。
而在源码2中,参数m和n是一个指针,是直接对b,b进行访问的,所以成功了,这样说你能明白么。
记得采纳哦,打字很累的呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-9 22:01:16 | 显示全部楼层
哦,补充一下,其实你可以不要定义p1,p2,p3的,可以在调用函数的时候用&操作符把变量的地址传过去就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-29 23:38:13 | 显示全部楼层
swap ( int *a, int *b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-13 12:37:36 | 显示全部楼层
要想swap()函数中交换两个变量的值,然后在main函数中使用,那么调用swap()时要使用输入型参数.
输入型参数说白了就是用指针变量作为函数的参数,比如说:
int a, b;                  要想交换a, b的值,那么应该用swap(int *x, int *y)这种形式调用.
int *a, *b;                要想交换a, b的值,那么应该用swap(int **x, int **y)这种形式调用.
至于你说的第一种,情况如下:

swap

swap
就是这样而已咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-21 18:17:14 | 显示全部楼层
小甲鱼不都说了吗,如果你要将函数中的形参赋值为主函数的实参,只能通过指针传递,当然楼主也可以将a,b,c定义为全局变量,再用函数进行交换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-23 19:46:03 | 显示全部楼层
7楼已经说的很明白了,如果不明白,那就是你指针入门都还没弄清楚,和函数的传参没有搞清楚。还是把视频教程再多
几遍吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-26 14:13:00 | 显示全部楼层
11111111111111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-27 20:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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