鱼C论坛

 找回密码
 立即注册
查看: 5563|回复: 12

三个数按大到小排序

[复制链接]
发表于 2013-4-24 20:50:35 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 破翳の刃 于 2013-4-24 21:01 编辑

#include<stdio.h>
int *p, a,b,c,*p1,*p2,*p3;
void main()
{
          void exchange(int *p1, int *p2, int *p3);
          printf("please input three numberes:\n");
          scanf("%d,%d,%d",&a,&b,&c);
          p1=&a;
          p2=&b;
          p3=&c;
          exchange(p1,p2,p3);
          printf("%d,%d,%d\n",*p1,*p2,*p3);
}

void exchange( int *p1, int *p2, int *p3)//交换函数
{
       void swap(int *p1, int *p2);//两个的交换函数
       if(*p1<*p2)
     {
       swap(p1,p2);
      }
      if(*p1<*p3)
    {
         swap(p1,p3);
     }
      if(*p2<*p3)
    {
        swap(p2,p3);
     }
}


void swap(int *p1, int *p2)
{
     p=p1;
     p1=p2;
     p2=p;
}
单步调试后,在exchange函数if语句中调用swap函数时还是好好的,但是出了swap函数突然p1和p2又回原了 不知道为什么,望高手指教
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 21:05:27 | 显示全部楼层
本帖最后由 曾拥有的方向 于 2013-4-24 21:09 编辑

swap 函数交换要 定义一个交换变量。。。
还有很错误 自己找吧。

#include<stdio.h>
void main()
{
        void exchange(int *q1,int *q2,int *q3);  

        int *p1,*p2,*p3;

        int a, b, c;

        printf("请输入三个数\n");

        scanf("%d %d %d",&a,&b,&c);

        p1=&a;
        p2=&b;
        p3=&c;

        exchange(p1,p2,p3);

        printf("%d>%d>%d\n",a,b,c);
}

void exchange(int *q1,int *q2,int *q3)
{
        void swap(int *p1,int *p2);

        if(*q1<*q2)
        {
                swap(q1,q2);
        }

        if(*q1<*q3)
        {
                swap(q1,q3);
        }

        if(*q2<*q3)
        {
                swap(q2,q3);
        }
}
void swap(int *p1,int *p2)
{
        int temp;
        temp=*p1;
        *p1=*p2;
        *p2=temp;
}

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 21:14:36 | 显示全部楼层
  1. void swap(int *p1, int *p2)
  2. {
  3.      p=p1;
  4.      p1=p2;
  5.      p2=p;
  6. }
复制代码
楼主swap函数里改变了参数p1,p2的值,如果想形参影响到实参,那么应该p1,p2的地址。也就是swap函数的参数要用二级指针。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-24 21:27:38 | 显示全部楼层

交换变量定为全局了在最上面,能不能直接通过交换指针指向而不通过交换变量来达到目的呢?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-24 21:30:24 | 显示全部楼层
小亮1201 发表于 2013-4-24 21:14
楼主swap函数里改变了参数p1,p2的值,如果想形参影响到实参,那么应该p1,p2的地址。也就是swap函数的参数 ...

谢谢,貌似swap改变了p1,p2的值,让p1,p2指向交换,应该可以了吧?p1,p2,p3分别指向最大的,第二大的和最小的。。不是很懂:L,能详细说说吗?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 21:39:27 | 显示全部楼层
破翳の刃 发表于 2013-4-24 21:30
谢谢,貌似swap改变了p1,p2的值,让p1,p2指向交换,应该可以了吧?p1,p2,p3分别指向最大的,第二大的和最 ...

p1,p2,p3虽然在swap函数里面交换了,当swap函数执行完毕之后,会将p1,p2,p3这三个变量释放了,也就是这三个变量不存在了,那么p1,p2,p3又怎么会指向最大最小呢,如果楼主想通过p1,p2,p3分别指向最大,最小值,你需要向swap函数传递你存放3个数的地址给swap函数,即使swap函数执行完了,这三个地址任然存在,所以这三个地址里面存放的最大值,最小值还在里面
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 22:39:31 | 显示全部楼层
最后一个函数,如果不加*号的话,就是交换两个指针的值,另外还涉及到另一个问题,就是形参实参的问题,参数的传递采用的是值传递的方式,但是如果加上*号就是交换了其指向的值,,,这样才能实现交换。。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 23:08:49 | 显示全部楼层
楼主加油,鱼C加油!我们都看好你哦!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-25 00:21:28 | 显示全部楼层
额。。。。swap是需要另外设一个数的
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-25 10:00:36 | 显示全部楼层
寂寞的神器 发表于 2013-4-24 21:39
p1,p2,p3虽然在swap函数里面交换了,当swap函数执行完毕之后,会将p1,p2,p3这三个变量释放了,也就是这三 ...

谢谢,通过解释明白多了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-25 11:01:58 | 显示全部楼层
楼上解释的听清楚的!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-25 22:28:09 | 显示全部楼层
...全局变量和局部变量问题。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-27 15:29:57 | 显示全部楼层
  1. void swap(int *p1, int *p2)
  2. {
  3.      p=p1;
  4.      p1=p2;
  5.      p2=p;
  6. }
复制代码
这里
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-31 22:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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