你这样编写有错,你的在比较的时候你都认为p1指向a,p2指向b,p3指向c,但是其实如果指针交换其值以后就不是这么指向了,所以结果出错。但是就是你这样不错,你也最好不要这么写,你在将变量a,b,c的值赋给指针p1,p2,p3指向的值以后最好不要在利用变量a,b,c。不然程序某些稍微修改下,其它地方也得修改,这样很不好,例如你修改"p1=&a;p2=&b;p3=&c;"为"p1=&c;p2=&b;p3=&a;"后下面的比较都要做大幅改动,按你的思路该这么写:
#include
int main()
{
int a,b,c,*p1,*p2,*p3,*p;
printf("请输入3个数字以逗号隔开:\n");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
printf("%d,%d,%d",p1, p2, p3);
if(*p1 > *p2){p=p1;p1=p2;p2=p;}
if(*p2 > *p3){p=p2;p2=p3;p3=p;}
if(*p1 > *p2){p=p1;p1=p2;p2=p;}
printf("由小到大排列是:\n");
printf("%d,%d,%d\n", *p1, *p2, *p3);
return 0;
}
其实排序的话比较简单的算法是用冒泡排序,但这里不能用,因为冒泡排序一般用于数组等存放有规律的数的排序,虽不能用,但是排序时你要用这个思想。冒泡排序原理比较简单,就是将最小或的数往一个方向冒就行。比如要将n个数从小到大排序,就有两种方法,一种是将小数往前冒,另一种是将大数往后冒。采取大的数往后冒的话,就要先找出n个数中最大的数,将其放在最后,然后不管最后一个数,找出n-1个数中最大的数将其放在最后(注意:是n-1个数的最后,不是所有数的最后),然后n-2个……,n-3个……,……,当只剩下一个时就排好了。
A=3,B=1,C=2,假设A的地址是R,B的地址是S,C的地址是T,
一开始 p1→R p2→S p1→T
第一次比较 p1→S p2→R p3→T
第二次比较 p1→T p2→R p3→S
第三次不成立 p1→T p2→R p3→S
那么最后的地址就是p1的地址就是T,p2的地址是R,p3的地址是S,
输出p1,p2,p3的地址对应的值是T(C)、R(A)、S(B)
你的目的是要P1指向数最小的数据,P3指向最大的数据,
但是由于第二次交换的时候指针的指向发生了变化,所以产生了错误。
你可以用冒泡法等算法进行排序。
你的程序指示交换指针,即交换了变量地址,变量a,b,c的值并没有改变。
当你输入 a=8,b=5,c=6时:
第一个 IF a>b(8>5),所以执行后得:p1=&b,p2=&a,p3=&c;
第二个 IF a>c(8>6,因为只是改变地址,a,b,c的值没有改变),所以执行后得:p1=&c,p2=&a,p3=&b;
第三个 IF b
在第一次判断是你的指针p1指向的值为5,即指向b;但是第二次判断之后又将p1指向a、c中的较小者c,但是C的值并不比p1原来指向的a小,故与p1始终指向值最小的变量的初衷不一样。
#include
int main()
{
int a,b,c,p,*p1,*p2,*p3;
printf("请输入3个数字以逗号隔开\n");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
if(a>b){p=*p1;*p1=*p2;*p2=p;}
if(a>c){p=*p1;*p1=*p3;*p3=p;}
if(b>c){p=*p2;*p2=*p3;*p3=p;}
printf("由小到大排列是\n");
printf("%d,%d,%d",*p1,*p2,*p3);
return 0;
}