user-0 提问: 输入几个数，利用指针来排序的这道例题【求助】

回复:
user: user-0
content: 引用 4 楼 user-2 的回复：引用大佬，我想问问，就是""PP=P"和if(pp!=p)这两个是跟着第一个循环执行的吗？，执行了四次  但是不可能只执行四次啊，因为你要比较的话，我举个例子：输入5，4，3，2，1  第一层循环：p指针指向5 5要先和4比较，5比4大，所以5和4值互换，变成了 4，5，3，2，1（第一层循环还没结束）  第一层循环：p指针指向5 5要先和4比较，5比4大，所以5和4地址互换，这时候for(q=p+1;q<a+5;q++)这层循环都没结束，所以继续和后续的符合条件数字的地址互换，等for(q=p+1;q<a+5;q++)这层循环结束，pp指向的是数字1的地址,然后回到第一层的循环，即执行到第二个if(pp!=p)的判断，此时条件满足将把4和1的值进行互换，然后进入第一层循环的第二次循环。int main() {     int a[5],*p,*pp,*q,t;     int i=0,j=0,k=0;     printf("input numbers:\n");//假设a[5]首地址为0，则p=a;等同于p=0;     for(p=a;p<a+5;p++){        scanf("%d,",p);     }      for(p=a;p<a+4;p++){      //p<a+4 防止数组下标越界。         i++;         pp=p;         for(q=p+1;q<a+5;q++){            j++;            if(*pp>*q)        //这个if属于for(q=p+1;q<a+5;q++)循环               pp=q;         }         k++;         if(pp!=p){          //这个if属于for(p=a;p<a+4;p++)循环            t=*p;            *p=*pp;            *pp=t;         }         printf("%d\n",*p);//这里加一句,可以看下每次内循环后，数组的数据。     }     {printf("\n");}     for(p=a;p<a+5;p++){         printf("%d\t",*p);     }      printf("\n\n③pp+p 语句被执行%d次\n\n③if(*pp>*q) 语句被执行%d次\n\n③if(pp!=p) 语句被执行%d次\n",i,j,k);     system("pause");     return 0; }  卧槽，牛笔，懂了，谢谢大哥

user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main() {     int a[5],*p,*pp,*q,t;      printf("input numbers:\n");     for(p=a;p<a+5;p++){         scanf("%d,",p);     }      pp = a;     for (p = a; p < pp+5; p++) {         for (q = p+1; q < pp + 5; q++) {             if (*p > *q) {                 t = *p;                 *p = *q;                 *q = t;             }         }     }       /*     for(p=a;p<a+4;p++){         pp=p;         for(q=p+1;q<a+5;q++)             if(*pp>*q)                 pp=q;         if(pp!=p){             t=*p;             *p=*pp;             *pp=t;         }      }     */     //{printf("\n");}     for(p=a;p<a+5;p++){         printf("%d\t",*p);     }      return 0; } 供参考～

user: user-2
content: 引用此时条件满足将把4和1的值进行互换，这句错误 ，修改如下：此时条件满足将把5和1的值进行互换，

user: user-2
content: 引用大佬，我想问问，就是""PP=P"和if(pp!=p)这两个是跟着第一个循环执行的吗？，执行了四次  但是不可能只执行四次啊，因为你要比较的话，我举个例子：输入5，4，3，2，1  第一层循环：p指针指向5 5要先和4比较，5比4大，所以5和4值互换，变成了 4，5，3，2，1（第一层循环还没结束）  第一层循环：p指针指向5 5要先和4比较，5比4大，所以5和4地址互换，这时候for(q=p+1;q<a+5;q++)这层循环都没结束，所以继续和后续的符合条件数字的地址互换，等for(q=p+1;q<a+5;q++)这层循环结束，pp指向的是数字1的地址,然后回到第一层的循环，即执行到第二个if(pp!=p)的判断，此时条件满足将把4和1的值进行互换，然后进入第一层循环的第二次循环。int main() {     int a[5],*p,*pp,*q,t;     int i=0,j=0,k=0;     printf("input numbers:\n");//假设a[5]首地址为0，则p=a;等同于p=0;     for(p=a;p<a+5;p++){        scanf("%d,",p);     }      for(p=a;p<a+4;p++){      //p<a+4 防止数组下标越界。         i++;         pp=p;         for(q=p+1;q<a+5;q++){            j++;            if(*pp>*q)        //这个if属于for(q=p+1;q<a+5;q++)循环               pp=q;         }         k++;         if(pp!=p){          //这个if属于for(p=a;p<a+4;p++)循环            t=*p;            *p=*pp;            *pp=t;         }         printf("%d\n",*p);//这里加一句,可以看下每次内循环后，数组的数据。     }     {printf("\n");}     for(p=a;p<a+5;p++){         printf("%d\t",*p);     }      printf("\n\n③pp+p 语句被执行%d次\n\n③if(*pp>*q) 语句被执行%d次\n\n③if(pp!=p) 语句被执行%d次\n",i,j,k);     system("pause");     return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复:供参考：int main() {     int a[5],*p,*pp,*q,t;     int i=0,j=0,k=0;     printf("input numbers:\n");//假设a[5]首地址为0，则p=a;等同于p=0;     for(p=a;p<a+5;p++){        scanf("%d,",p);     }      for(p=a;p<a+4;p++){      //p<a+4 防止数组下标越界。         i++;         pp=p;         for(q=p+1;q<a+5;q++){            j++;            if(*pp>*q)        //这个if属于for(q=p+1;q<a+5;q++)循环               pp=q;         }         k++;         if(pp!=p){          //这个if属于for(p=a;p<a+4;p++)循环            t=*p;            *p=*pp;            *pp=t;         }     }     {printf("\n");}     for(p=a;p<a+5;p++){         printf("%d\t",*p);     }      printf("\n\n③pp+p 语句被执行%d次\n\n③if(*pp>*q) 语句被执行%d次\n\n③if(pp!=p) 语句被执行%d次\n",i,j,k);     system("pause");     return 0; }   //①为什么第一个循环是for(p=a;p<a+4;p++)而不是for(p=a;p<a+5;p++)? //  为了防止下标越界，当p<a+4=3时，下一个for(q=p+1;q<a+5;q++)循环是 p+1=4，数组a[5]=a[0]....a[4].  //④我如果把两个if都放进第二个循环中，那这个程序是否还能正确输出？如果不能又是什么原因 //  肯定不能正确输出，可以自己调试输出看看。循环里要干的工作步骤各不相同，逻辑关系不同，混在一起就乱了。  //input numbers: //3 1 5 2 4  //1       2       3       4       5  //③pp+p 语句被执行4次  //③if(*pp>*q) 语句被执行10次  //③if(pp!=p) 语句被执行4次   大佬，我想问问，就是""PP=P"和if(pp!=p)这两个是跟着第一个循环执行的吗？，执行了四次  但是不可能只执行四次啊，因为你要比较的话，我举个例子：输入5，4，3，2，1  第一层循环：p指针指向5 5要先和4比较，5比4大，所以5和4值互换，变成了 4，5，3，2，1（第一层循环还没结束） 4再和3比较，所以4也要和3值互换，但是第二个if中的语句已经被使用过了，所以无法互换了呀  所以难道第二个if不是执行10次吗？应该讲第二个if放入第二层循环中才合理？这地方不太懂。。求大佬讲讲

user: user-2
content: 供参考：int main() {     int a[5],*p,*pp,*q,t;     int i=0,j=0,k=0;     printf("input numbers:\n");//假设a[5]首地址为0，则p=a;等同于p=0;     for(p=a;p<a+5;p++){        scanf("%d,",p);     }      for(p=a;p<a+4;p++){      //p<a+4 防止数组下标越界。         i++;         pp=p;         for(q=p+1;q<a+5;q++){            j++;            if(*pp>*q)        //这个if属于for(q=p+1;q<a+5;q++)循环               pp=q;         }         k++;         if(pp!=p){          //这个if属于for(p=a;p<a+4;p++)循环            t=*p;            *p=*pp;            *pp=t;         }     }     {printf("\n");}     for(p=a;p<a+5;p++){         printf("%d\t",*p);     }      printf("\n\n③pp+p 语句被执行%d次\n\n③if(*pp>*q) 语句被执行%d次\n\n③if(pp!=p) 语句被执行%d次\n",i,j,k);     system("pause");     return 0; }   //①为什么第一个循环是for(p=a;p<a+4;p++)而不是for(p=a;p<a+5;p++)? //  为了防止下标越界，当p<a+4=3时，下一个for(q=p+1;q<a+5;q++)循环是 p+1=4，数组a[5]=a[0]....a[4].  //④我如果把两个if都放进第二个循环中，那这个程序是否还能正确输出？如果不能又是什么原因 //  肯定不能正确输出，可以自己调试输出看看。循环里要干的工作步骤各不相同，逻辑关系不同，混在一起就乱了。  //input numbers: //3 1 5 2 4  //1       2       3       4       5  //③pp+p 语句被执行4次  //③if(*pp>*q) 语句被执行10次  //③if(pp!=p) 语句被执行4次