如何用二维数组、数组指针进行选择法排序。为何是无法修改的左值?怎么改?

#include <stdio.h >
#include <string.h>
void main ()
{
char arr[][10]={"America","England","Chian","Japan","France"},tmp=NULL;
char (ptr)[10]=arr;
short i,j,k;
printf("排序前:");
for(i=0;i<5;i++,ptr++)
printf("%s\n",*ptr);
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(strcmp(*(ptr+i),*(ptr+j))>0)
k=j;
if(k!=i)
{
strcpy(tmp,
(ptr+i));
strcpy(
(ptr+i),(ptr+k));
strcpy(
(ptr+k),tmp);
}
}
for(i=0;i<5;i++,ptr++)
printf("%s\n",*ptr);
getch();
}

代码丢失了很多星号,不知道到底有多少错误,明显的基础错误如下:
(1)temp没有申请空间
(2)排序前,需要把ptr重置一下,排序时,内层for循环的if语句 if(strcmp( *(ptr+i), *(ptr+j))>0)这里不应该用 ptr+i,而是ptr+k,每次比较应该是与当前最小值比较,而不是跟 ptr+i比较。
(3)最后输出的时候,需要把ptr重新赋值一下
代码贴在下面,修改的部分在代码中有注释。
运行结果:

img

代码修改如下:

#include <stdio.h >
#include <string.h>
void main ()
{
    char arr[][10]={"America","England","Chian","Japan","France"},tmp[10];//修改1 给tmp一块内存空间
    char (*ptr)[10]=arr;
    short i,j,k;

    printf("排序前:");

    for(i=0;i<5;i++,*ptr++)
        printf("%s\n",*ptr);

    ptr = arr; //修改2 重置ptr
    for(i=0;i<4;i++)
    {
        k=i;
        for(j=i+1;j<5;j++)
        {
            if(strcmp(*(ptr+k),*(ptr+j))>0) //修改3 ptr+i改成 ptr+k,每次都是跟当前最小值进行比较
                k=j;
        }
        if(k!=i)
        {
            strcpy(tmp,*(ptr+i));
            strcpy(*(ptr+i),*(ptr+k));
            strcpy(*(ptr+k),tmp);
        }
    }

    ptr = arr; //修改4 重置ptr
    for(i=0;i<5;i++,ptr++)
        printf("%s\n",*ptr);
    getchar();

}

主要两个问题,一是tmp没有分配空间;二是ptr在循环中进行了移动,那么后续需要将ptr重新指向arr才行
修改如下:

#include <stdio.h >
#include <stdlib.h>
#include <string.h>
void main ()
{
    char arr[][10]={"America","England","Chian","Japan","France"};
    char tmp[10];
    char (*ptr)[10]=arr;
    short i,j,k;
    printf("排序前:\n");
    for(i=0;i<5;i++,*ptr++)
        printf("%s\n",*ptr);
    ptr = arr;
    for(i=0;i<4;i++)
    {
        k=i;
        for(j=i+1;j<5;j++)
            if(strcmp(*(ptr+i),*(ptr+j))>0)
                k=j;
        if(k!=i)
        {
            strcpy(tmp,*(ptr+i));
            strcpy(*(ptr+i),*(ptr+k));
            strcpy(*(ptr+k),tmp);
        }
    }
    printf("排序后:\n");
    ptr = arr;
    for(i=0;i<5;i++,*ptr++)
        printf("%s\n",*ptr);

    system("pause");
}