鱼C论坛

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

[已解决]指针没学明白,求大神指出问题

[复制链接]
发表于 2018-1-17 16:40:56 | 显示全部楼层 |阅读模式

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

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

x
题目:从键盘上输入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);//返回三个地址
}
结果报了一堆错。自己怎么也找不到错在哪里了。
QQ截图20180117163932.png
求指点
最佳答案
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;
    }           
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-17 17:39:08 | 显示全部楼层
错的地方太多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
    }           
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-17 18:10:07 | 显示全部楼层
主要问题有两个:
1. 比较函数中的max、middle、min这三个变量都在main当中声明的,作用域不对;
2. 比较函数的返回值是int,你这么写不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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);
}

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

现在我有些想不明白,指针做为实参,传递给形参的是什么?是地址吗?那为什么函数里指向地址已经变换了,实参还是没有反应呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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);
}
调试后有个警告
运行以后结果不变 QQ截图20180118113220.png
是不是可以这样理解呢?
max、mid、min三个指针里的地址虽都已经指向了大、中、小数的地址,但它们是局部的指针变量。对于x、y、z三个指针变量没有任何影响。
即指针变量做为实参传递给形参,也仅是一个值的引用,不会对指针变量实参有返回值和影响。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 10:55:41 | 显示全部楼层
学了几天,又返回来看自己的程序。
首先是实参和形参搞混乱了。
再次是函数return只能有一个返回值,目前以我学的知识返回三个指针是不可能地。所以在函数里直接打印即可实现比较大小。
仅此记录一下,给自己的混乱收个尾。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 05:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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