指针没学明白,求大神指出问题
题目:从键盘上输入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:}
求指点 错的地方太多了 你的代码中要注意几点
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;
}
} 主要问题有两个:
1. 比较函数中的max、middle、min这三个变量都在main当中声明的,作用域不对;
2. 比较函数的返回值是int,你这么写不对 谢谢您。我大致明白了。却还没有透彻。我的理解是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:}
看了神人对指针的解释。
又做了测试,看看指针能不能有返回值
#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三个指针变量没有任何影响。
即指针变量做为实参传递给形参,也仅是一个值的引用,不会对指针变量实参有返回值和影响。
学了几天,又返回来看自己的程序。
首先是实参和形参搞混乱了。
再次是函数return只能有一个返回值,目前以我学的知识返回三个指针是不可能地。所以在函数里直接打印即可实现比较大小。
仅此记录一下,给自己的混乱收个尾。
页:
[1]