编程小土豆 发表于 2019-8-5 15:06:39

代码出现未知错误

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

void main()
{
      voidexchange(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);
}


voidexchange(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);
      }
}

voidswap(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;
}
但是这个它不工作,输入什么样的顺序就照样输出,没有进行大小比较。希望指出错误的地方和修改建议,谢谢。

wp231957 发表于 2019-8-5 15:25:46

交换函数必用指针

jackz007 发表于 2019-8-5 15:36:51

本帖最后由 jackz007 于 2019-8-5 15:41 编辑

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

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

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

void exchange(int * x , int * y , int * z)
{
      if (* x < * y) swap(x , y) ;
      if (* x < * z) swap(x , z) ;
      if (* y < * z) swap(y , z) ;
}

int main(void)
{
      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) ;
      fflush(stdin)                  ;
      getchar()                        ;
}

micolar 发表于 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;

编程小土豆 发表于 2019-8-5 19:15:14

感谢大家的回答,还有几个小概念没有搞太清楚:
不用指针的话就无法通过函数来改变变量的值吗?运用指针有没有限制,是不是只要写上*指针变量就可以在任何地方改变变量的值?

micolar 发表于 2019-8-5 20:27:39

应该吧
不过要注意使用
特别是未初始化也就是没给它赋值最好不要对它所指向的值操作

编程小土豆 发表于 2019-8-5 21:07:46

明白了,谢谢{:5_109:}
页: [1]
查看完整版本: 代码出现未知错误