【C语言问题】同一个问题利用指针的两种实现,另一种出现问题,求大佬解答

问题描述:

题目:编写一个程序,输入5个城市名,按字母表顺序对这5个城市排序输出

这是一种实现方式


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 int main()
{
    char city[6][10]={"beijing","shenzhen","nanjing","dalian","shanghai","qingdao"};//存储城市名 
    char *ptstr[6];//指针数组
    int i;
    for(i=0;i<6;i++)
    {
        ptstr[i]=city[i];//令指针指向城市名 
    } 
    char *temp;
    int m,n;
    //用冒泡排序法进行排序
    for(m=1;m<6;m++)
    {
        for(n=1;n<6-m;n++)
        {
            if(strcmp(ptstr[n-1],ptstr[n])>0)
            {
                temp=ptstr[n-1];
                ptstr[n-1]=ptstr[n];
                ptstr[n]=temp;
            }
        }
    }
    for(i=0;i<6;i++)
     puts(ptstr[i]);
    return 0;
}


但改用另一种方式就无法通过编译

另一种方式的实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char city[6][10];//存储城市名 
    int i;
    for(i=0;i<6;i++)
    {
        gets(city[i]);
    } 
    char *temp;
    int m,n;
    //用冒泡排序法进行排序
    for(m=1;m<6;m++)
    {
        for(n=1;n<6-m;n++)
        {
            if(strcmp(city[n-1],city[n])>0)
            {
                temp=city[n-1];
                city[n-1]=city[n];
                city[n]=temp;
            }
        }
    }
    for(i=0;i<6;i++)
     puts(city[i]);
    return 0;
}


数组名同样是指向数组的指针,为何第二个版本的代码会出错

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char city[6][10];//存储城市名 
    int i,j; //改
    for(i=0;i<6;i++)
    {
        gets(city[i]);
    } 
    char temp[10];
    int m,n;
    //用冒泡排序法进行排序
    for(m=0;m<6;m++) //改
    {
        for(n=1;n<6-m;n++)
        {
            if(strcmp(city[n-1],city[n])>0)
            {
                for (j = 0; j < 10; j++) //改
                {
                    temp[j]=city[n-1][j];
                    city[n-1][j]=city[n][j];
                    city[n][j]=temp[j];
                }
            }
        }
    }
    for(i=0;i<6;i++)
     puts(city[i]);
    return 0;
}