分类：电脑/网络-程序设计-C/C++
问题：一道C语言程序的郁闷程序题目是输入n个字符串（n&lt;10）， 
题目是输入n个字符串（n<10），然后比较大小，按从小到大排列。本来可以用指针数组的编写，也没有错。我换了个指向数组的指针，但是一编译就出了很多错误，希望高手帮忙看看，详细解释一下错误所在，谢谢了！！所编程序如下：#include<stdio.h>#include<string.h>void main(){   char ch[10][20];   char (*p)[20];   p=ch;   int n,i,j;   char *temp;   printf("题目是输入n个字符串（n<10），然后比较大小，按从小到大排列。本来可以用指针数组的编写，也没有错。我换了个指向数组的指针，但是一编译就出了很多错误，希望高手帮忙看看，详细解释一下错误所在，谢谢了！！所编程序如下：#include<stdio.h>#include<string.h>void main(){   char ch[10][20];   char (*p)[20];   p=ch;   int n,i,j;   char *temp;   printf("输入字符串个数：");   scanf("%d",&n);   getchar();   printf("输入字符串：");   for(i=0;i<n;i++)     gets(*p++);   for(i=0;i<n-1;i++)   {     for(j=0;j<n-i-1;j++)       if(strcmp(*(p+j),*(p+j+1))>0)       {       temp=p+j;       p+j=p+j+1;       p+j+1=temp;       }   }  printf("输出排序后的字符串：");  for(i=0;i<n;i++)    puts(*p++);}
回答：呵呵，提问者现在不是要用指针数组来解决问题，而是要用数组指针，作为学习，这里面不存在什么“方向性的、极严重的错误”。就提问者的代码来看，提问者的主要问题还是没有理解什么是“指向数组的指针”。以你的代码中的这一行为例：temp=p+j；temp是什么？是一个char型指针！p+j是什么？是一个指向char [20]的指针！两者根本不是同一种类型，怎么能等于呢？就算要等于，也是temp=*(p+j)。后面的两行p+j=p+j+1;p+j+1=temp；也有同样的问题。当然，后面这两行还有另一个更深入些的问题，就是数组与指针的区别问题，以及等于表达的使用问题。对这个问题我不深入展开了。只提出两个问题供你思考：首先：如果我说3+5=6+8这个表达式是否成立，你肯定会说不成立；又：假如有数组int a[10];又有一个已经分配了地址空间的int *p;表达式a=p能否成立？或者a++;这个语句是否成立？显然不成立！搞清了这两个问题你就明白了*(p+j)=*(p+j+1)也是行不通的，尽管道理上讲好象是对的。因此，你的代码可以这样修改，仍然使用数组指针：(直接拷贝到VC下编译即可，如果你自己手工修改原来的代码，请注意除了上面的3行代码外，还有另外的几处修改！)#include<stdio.h>#include<string.h>#include "stdlib.h"void main(){char ch[10][20];char (*p)[20];p=&ch[0];int n,i,j;char *temp;temp=(char *)malloc(sizeof(char)*20);printf("输入字符串个数：");scanf("%d",&n);getchar();printf("输入字符串：");for(i=0;i<n;i++)gets(*p++);p=p-i;for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++)if(strcmp(*(p+j),*(p+j+1))>0){strcpy(temp,*(p+j));strcpy(*(p+j),*(p+j+1));strcpy(*(p+j+1),temp);}}printf("输出排序后的字符串：");for(i=0;i<n;i++)puts(*p++);free(temp);}