鱼C论坛

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

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

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

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

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

x
题目:从键盘上输入3个数,按从大到小的顺序进行排列。
我编的代码如下:
  1. #include <stdio.h>
  2. void main()
  3. {
  4.     printf("please input 3 numbers:");
  5.     int a,b,c;
  6.     scanf("%d%d%d",&a,&b,&c);
  7.     extern int *max,*mid,*min;//定义指针
  8.     int compare(int *x,int *y,int *z);//声明比较函数
  9.     max=&a;//指针赋值
  10.     mid=&b;
  11.     min=&c;
  12.     compare(max,mid,min);//传递实参
  13.     printf("%d>%d>%d\n",*max,*mid,*min);
  14. }
  15. int compare(int *x,int *y,int *z)//定义比较函数
  16. {
  17.     int *p;
  18.     if(*max<*min)
  19.     {
  20.         p=max;
  21.         max=min;//a和c比较,max为大数的地址,min为小数地址
  22.         min=p;
  23.     }
  24.         
  25.     if(*max<*mid)
  26.     {
  27.         p=max;
  28.         max=mid;//大数和b比较,max为大数的地址,mid为小数地址
  29.         mid=p;
  30.     }
  31.     if(*mid<*min)
  32.     {
  33.         p=mid;
  34.         mid=min;
  35.         min=p;
  36.     }           //两个小数比较,mid为次大数的地址,min为小数地址
  37.     return (max,mid,min);//返回三个地址
  38. }
复制代码

结果报了一堆错。自己怎么也找不到错在哪里了。
QQ截图20180117163932.png
求指点
最佳答案
2018-1-17 17:54:55
你的代码中要注意几点

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

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

  1. #include <stdio.h>

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

  3. void main()
  4. {   
  5.     int a,b,c;
  6.         int *max, *mid, *min;

  7.         printf("please input 3 numbers:");
  8.     scanf("%d %d %d",&a,&b,&c);
  9.    
  10.     max=&a;//指针赋值
  11.     mid=&b;
  12.     min=&c;

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

  14.     printf("%d>%d>%d\n",*max,*mid,*min);
  15. }
  16. void compare(int *x,int *y,int *z)//定义比较函数
  17. {
  18.     int p;
  19.     if(*x<*y)
  20.     {
  21.         p=*y;
  22.         *y=*x;
  23.         *x=p;
  24.     }
  25.         
  26.     if(*x<*z)
  27.     {
  28.         p=*x;
  29.         *x=*z;
  30.         *z=p;
  31.     }
  32.     if(*y<*z)
  33.     {
  34.         p=*y;
  35.         *y=*z;
  36.         *z=p;
  37.     }           
  38. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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个指针指向的值即可

  1. #include <stdio.h>

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

  3. void main()
  4. {   
  5.     int a,b,c;
  6.         int *max, *mid, *min;

  7.         printf("please input 3 numbers:");
  8.     scanf("%d %d %d",&a,&b,&c);
  9.    
  10.     max=&a;//指针赋值
  11.     mid=&b;
  12.     min=&c;

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

  14.     printf("%d>%d>%d\n",*max,*mid,*min);
  15. }
  16. void compare(int *x,int *y,int *z)//定义比较函数
  17. {
  18.     int p;
  19.     if(*x<*y)
  20.     {
  21.         p=*y;
  22.         *y=*x;
  23.         *x=p;
  24.     }
  25.         
  26.     if(*x<*z)
  27.     {
  28.         p=*x;
  29.         *x=*z;
  30.         *z=p;
  31.     }
  32.     if(*y<*z)
  33.     {
  34.         p=*y;
  35.         *y=*z;
  36.         *z=p;
  37.     }           
  38. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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三个指针的指向了。
自己调试程序,做了测试
  1. #include <stdio.h>
  2. void compare(int *max,int *mid,int *min);//声明比较函数
  3. void main()
  4. {
  5.     int *x,*y,*z;//定义指针
  6.     int a,b,c;
  7.     a=81;b=75;c=91;
  8.     x=&a;//指针赋值
  9.     y=&b;
  10.     z=&c;
  11.     compare(x,y,z);//传递实参
  12.     printf("%d>%d>%d\n",*x,*y,*z);
  13. }
  14. void compare(int *max,int *mid,int *min)//定义比较函数
  15. {
  16.     int *p;
  17.     if(*max<*min)
  18.     {
  19.         p=max;
  20.         max=min;//a和c比较,max为大数的地址,min为小数地址
  21.         min=p;
  22.         printf("%d,%d\n",*max,*min);
  23.     }
  24.         
  25.     if(*max<*mid)
  26.     {
  27.         p=max;
  28.         max=mid;//大数和b比较,max为大数的地址,mid为小数地址
  29.         mid=p;
  30.          printf("%d,%d\n",*max,*mid);
  31.     }
  32.     if(*mid<*min)
  33.     {
  34.         p=mid;
  35.         mid=min;
  36.         min=p;
  37.          printf("%d,%d\n",*mid,*min);
  38.     }           //两个小数比较,mid为次大数的地址,min为小数地址
  39. printf("%d,%d,%d\n",*max,*mid,*min);
  40. }
复制代码


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

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

使用道具 举报

 楼主| 发表于 2018-1-18 11:37:35 | 显示全部楼层

看了神人对指针的解释。
又做了测试,看看指针能不能有返回值
  1. #include <stdio.h>
  2. int compare(int *max,int *mid,int *min);//声明比较函数
  3. void main()
  4. {
  5.     int *x,*y,*z;//定义指针
  6.     int a,b,c;
  7.     a=81;b=75;c=91;
  8.     x=&a;//指针赋值
  9.     y=&b;
  10.     z=&c;
  11.     compare(x,y,z);//传递实参
  12.     printf("%d>%d>%d\n",*x,*y,*z);
  13. }
  14. int compare(int *max,int *mid,int *min)//定义比较函数
  15. {
  16.     int *p;
  17.     if(*max<*min)
  18.     {
  19.         p=max;
  20.         max=min;//a和c比较,max为大数的地址,min为小数地址
  21.         min=p;
  22.         printf("%d,%d\n",*max,*min);
  23.     }
  24.         
  25.     if(*max<*mid)
  26.     {
  27.         p=max;
  28.         max=mid;//大数和b比较,max为大数的地址,mid为小数地址
  29.         mid=p;
  30.          printf("%d,%d\n",*max,*mid);
  31.     }
  32.     if(*mid<*min)
  33.     {
  34.         p=mid;
  35.         mid=min;
  36.         min=p;
  37.          printf("%d,%d\n",*mid,*min);
  38.     }           //两个小数比较,mid为次大数的地址,min为小数地址
  39. printf("%d,%d,%d\n",*max,*mid,*min);
  40. return(max,mid,min);
  41. }
复制代码

调试后有个警告
运行以后结果不变 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-4-19 11:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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