fairylee83 发表于 2018-1-17 16:40:56

指针没学明白,求大神指出问题

题目:从键盘上输入3个数,按从大到小的顺序进行排列。
我编的代码如下:
#include <stdio.h>
void main()
{
    printf("please input 3 numbers:");
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    extern int *max,*mid,*min;//定义指针
    int compare(int *x,int *y,int *z);//声明比较函数
    max=&a;//指针赋值
    mid=&b;
    min=&c;
    compare(max,mid,min);//传递实参
    printf("%d>%d>%d\n",*max,*mid,*min);
}
int compare(int *x,int *y,int *z)//定义比较函数
{
    int *p;
    if(*max<*min)
    {
      p=max;
      max=min;//a和c比较,max为大数的地址,min为小数地址
      min=p;
    }
      
    if(*max<*mid)
    {
      p=max;
      max=mid;//大数和b比较,max为大数的地址,mid为小数地址
      mid=p;
    }
    if(*mid<*min)
    {
      p=mid;
      mid=min;
      min=p;
    }         //两个小数比较,mid为次大数的地址,min为小数地址
    return (max,mid,min);//返回三个地址
}
结果报了一堆错。自己怎么也找不到错在哪里了。{:5_96:}

求指点

鱼C丶彪哥 发表于 2018-1-17 17:39:08

错的地方太多了

ba21 发表于 2018-1-17 17:54:55

你的代码中要注意几点

1,基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

2,函数中的 int *p; 你清楚的知道 指针永远都只能指向一个值,而不可能保存一个值,指针里面保存的仅仅是一个地址。
3,return (max,mid,min);//返回三个地址 ,这里,既然传的是指针到函数内,那么就不存在还用返回值的说法。函数内进行交换的是3个指针指向的值,指针本身的地址是没有改变,所以在主函数直接输出3个指针指向的值即可

#include <stdio.h>

void compare(int *x,int *y,int *z);//声明比较函数

void main()
{   
    int a,b,c;
        int *max, *mid, *min;

        printf("please input 3 numbers:");
    scanf("%d %d %d",&a,&b,&c);
   
    max=&a;//指针赋值
    mid=&b;
    min=&c;

    compare(max,mid,min);//传递实参

    printf("%d>%d>%d\n",*max,*mid,*min);
}
void compare(int *x,int *y,int *z)//定义比较函数
{
    int p;
    if(*x<*y)
    {
      p=*y;
      *y=*x;
      *x=p;
    }
      
    if(*x<*z)
    {
      p=*x;
      *x=*z;
      *z=p;
    }
    if(*y<*z)
    {
      p=*y;
      *y=*z;
      *z=p;
    }         
}

woaijiajia 发表于 2018-1-17 18:10:07

主要问题有两个:
1. 比较函数中的max、middle、min这三个变量都在main当中声明的,作用域不对;
2. 比较函数的返回值是int,你这么写不对

fairylee83 发表于 2018-1-18 11:07:38

谢谢您。我大致明白了。却还没有透彻。我的理解是compare虽然进行了指针指向的变换,但没有返回值,所以也就无法变换x、y、z三个指针的指向了。
自己调试程序,做了测试
#include <stdio.h>
void compare(int *max,int *mid,int *min);//声明比较函数
void main()
{
    int *x,*y,*z;//定义指针
    int a,b,c;
    a=81;b=75;c=91;
    x=&a;//指针赋值
    y=&b;
    z=&c;
    compare(x,y,z);//传递实参
    printf("%d>%d>%d\n",*x,*y,*z);
}
void compare(int *max,int *mid,int *min)//定义比较函数
{
    int *p;
    if(*max<*min)
    {
      p=max;
      max=min;//a和c比较,max为大数的地址,min为小数地址
      min=p;
      printf("%d,%d\n",*max,*min);
    }
      
    if(*max<*mid)
    {
      p=max;
      max=mid;//大数和b比较,max为大数的地址,mid为小数地址
      mid=p;
         printf("%d,%d\n",*max,*mid);
    }
    if(*mid<*min)
    {
      p=mid;
      mid=min;
      min=p;
         printf("%d,%d\n",*mid,*min);
    }         //两个小数比较,mid为次大数的地址,min为小数地址
printf("%d,%d,%d\n",*max,*mid,*min);
}

输出结果是
也就是说明明自定义函数compare里面已经把max,mid,min三个指针的地址指向了大、中、小三个数的地址。

现在我有些想不明白,指针做为实参,传递给形参的是什么?是地址吗?那为什么函数里指向地址已经变换了,实参还是没有反应呢{:5_94:}

fairylee83 发表于 2018-1-18 11:37:35


看了神人对指针的解释。
又做了测试,看看指针能不能有返回值
#include <stdio.h>
int compare(int *max,int *mid,int *min);//声明比较函数
void main()
{
    int *x,*y,*z;//定义指针
    int a,b,c;
    a=81;b=75;c=91;
    x=&a;//指针赋值
    y=&b;
    z=&c;
    compare(x,y,z);//传递实参
    printf("%d>%d>%d\n",*x,*y,*z);
}
int compare(int *max,int *mid,int *min)//定义比较函数
{
    int *p;
    if(*max<*min)
    {
      p=max;
      max=min;//a和c比较,max为大数的地址,min为小数地址
      min=p;
      printf("%d,%d\n",*max,*min);
    }
      
    if(*max<*mid)
    {
      p=max;
      max=mid;//大数和b比较,max为大数的地址,mid为小数地址
      mid=p;
         printf("%d,%d\n",*max,*mid);
    }
    if(*mid<*min)
    {
      p=mid;
      mid=min;
      min=p;
         printf("%d,%d\n",*mid,*min);
    }         //两个小数比较,mid为次大数的地址,min为小数地址
printf("%d,%d,%d\n",*max,*mid,*min);
return(max,mid,min);
}
调试后有个警告
运行以后结果不变
是不是可以这样理解呢?
max、mid、min三个指针里的地址虽都已经指向了大、中、小数的地址,但它们是局部的指针变量。对于x、y、z三个指针变量没有任何影响。
即指针变量做为实参传递给形参,也仅是一个值的引用,不会对指针变量实参有返回值和影响。

fairylee83 发表于 2018-1-24 10:55:41

学了几天,又返回来看自己的程序。
首先是实参和形参搞混乱了。
再次是函数return只能有一个返回值,目前以我学的知识返回三个指针是不可能地。所以在函数里直接打印即可实现比较大小。
仅此记录一下,给自己的混乱收个尾。
页: [1]
查看完整版本: 指针没学明白,求大神指出问题