鱼C论坛

 找回密码
 立即注册
查看: 1205|回复: 6

[已解决]代码出现未知错误

[复制链接]
发表于 2019-8-5 15:06:39 | 显示全部楼层 |阅读模式

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

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

x
想问一下这个不用指针应该也能实现吧:
这是小甲鱼源代码:
#include <stdio.h>

void main()
{
      void  exchange(int *q1, int *q2, int *q3);

      int a, b, c, *p1, *p2, *p3;

      scanf("%d %d %d", &a, &b, &c);
      p1 = &a;
      p2 = &b;
      p3 = &c;

      exchange(p1, p2, p3);  //确保a > b > c
      printf("%d %d %d\n", a, b, c);
}


void  exchange(int *q1, int *q2, int *q3) //int *q1 = p1;
{
      void swap(int *pt1, int *pt2); //用于交换&……&%

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

void  swap(int *pt1, int *pt2)
{
      int temp;

      temp = *pt1;
      *pt1 = *pt2;
      *pt2 = temp;
}
这是我编写的不用指针的代码:
#include <stdio.h>
#include <conio.h>


void main()
{
        void exchange(int x, int y, int z);
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);

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


void exchange(int x, int y, int z)
{
        void swap(int a, int b);

        if (x<y)
        {
                swap(x,y);
        }
        if(x<z)
        {
                swap(x,z);
        }
        if(y<z)
        {
                swap(y,z);
        }
}


void swap(int a, int b)
{
        int temp;
        temp = a;
        a = b;
        b = temp;
}
但是这个它不工作,输入什么样的顺序就照样输出,没有进行大小比较。希望指出错误的地方和修改建议,谢谢。
最佳答案
2019-8-5 15:57:25
本帖最后由 micolar 于 2019-8-5 15:58 编辑

int a = 1,b = 2;
void swap(int a, int b)
{
        int temp;
        temp = a;
        a = b;
        b = temp;
}
swap(a,b);

没有交换是swap函数里面的a,b 跟swap函数外的a,b是不一样的

你也可以理解为

swap(a,b) == swap(1,2) != swap(a,b);
当执行swap函数时编译器分配另外两个变量a,b 然后把swap函数传入进来的值付给这两个变量 swap函数结束后这两个a,b清零 换言之你可以把它当成swap(数值,数值)而不是swap(变量名,变量名)

你用指针的话
void swap(int* a, int *b)
{
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
}
这个你也可以把它当为swap(数值,数值)
只要知道变量a的地址 就能访问a 也就可以在swap访问到它

用指针和不用指针的区别是
指针可以随意访问你想访问的变量的值 只要你知道它地址
举个例子  

const int a = 4;

我们知道再次调用a = 5编译器是不给通过的

但是我们可以获取它的指针饶过它

*&a = 5;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-5 15:25:46 | 显示全部楼层
交换函数必用指针  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 15:36:51 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-5 15:41 编辑

    1、一般情况下,函数的参数是单向只读的,也就是说,在函数中对参数进行修改,其影响仅限于函数内部,不会被带到函数以外;如果需要双向读写,就需要传址,这样,在函数中对参数内容的修改就会被带到函数以外;

    2、同一个源程序文件中的各个函数只要在使用前定义,就可以不用提前声明。
  1. #include <stdio.h>

  2. void swap(int * a , int * b)
  3. {
  4.         int temp   ;
  5.         temp = * a ;
  6.         * a = * b  ;
  7.         * b = temp ;
  8. }

  9. void exchange(int * x , int * y , int * z)
  10. {
  11.         if (* x < * y) swap(x , y) ;
  12.         if (* x < * z) swap(x , z) ;
  13.         if (* y < * z) swap(y , z) ;
  14. }

  15. int main(void)
  16. {
  17.         int a , b , c                    ;
  18.         scanf("%d%d%d",&a,&b,&c)         ;
  19.         exchange(& a ,& b , & c)         ;
  20.         printf("%d\n%d\n%d\n",a , b , c) ;
  21.         fflush(stdin)                    ;
  22.         getchar()                        ;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 15:57:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 micolar 于 2019-8-5 15:58 编辑

int a = 1,b = 2;
void swap(int a, int b)
{
        int temp;
        temp = a;
        a = b;
        b = temp;
}
swap(a,b);

没有交换是swap函数里面的a,b 跟swap函数外的a,b是不一样的

你也可以理解为

swap(a,b) == swap(1,2) != swap(a,b);
当执行swap函数时编译器分配另外两个变量a,b 然后把swap函数传入进来的值付给这两个变量 swap函数结束后这两个a,b清零 换言之你可以把它当成swap(数值,数值)而不是swap(变量名,变量名)

你用指针的话
void swap(int* a, int *b)
{
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
}
这个你也可以把它当为swap(数值,数值)
只要知道变量a的地址 就能访问a 也就可以在swap访问到它

用指针和不用指针的区别是
指针可以随意访问你想访问的变量的值 只要你知道它地址
举个例子  

const int a = 4;

我们知道再次调用a = 5编译器是不给通过的

但是我们可以获取它的指针饶过它

*&a = 5;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-5 19:15:14 | 显示全部楼层
感谢大家的回答,还有几个小概念没有搞太清楚:
不用指针的话就无法通过函数来改变变量的值吗?运用指针有没有限制,是不是只要写上  *指针变量  就可以在任何地方改变变量的值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 20:27:39 | 显示全部楼层
应该吧
不过要注意使用
特别是未初始化也就是没给它赋值最好不要对它所指向的值操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-5 21:07:46 | 显示全部楼层
明白了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 18:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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