C语言 指针 将字符串按长度排列

根据在网上找的代码自己改了一个 但是不知道哪里错了

求问(*p)[N]和*p[N]在写的时候有什么区别

#include<stdio.h>
#include<string.h>
#define M 5
#define N 20
void StrSort(char (*p)[N])
{
    int i,j,k,x[M];		char t[N];
    for(i=0;  i<M;  i++ )
        x[i]=strlen(p[i]);

    for(i=0;  i<M;  i++  )      /////////////i<M
    {	k=i;
        for(j=i+1;  j<M;  j++ )
            if(x[j]<x[i])	k=j;
        if(k!=i)
        {	strcpy(t,p[i]);
            strcpy(p[i],p[k]);
            strcpy(p[k],t);
            x[k]=x[i];
        }
    }
}
int main()
{
    char p[M][N];
    int i;
    for(i=0;i<M;i++)
        scanf("%s",p[i]);   /////////////////不要加\n
    StrSort(p);
    for(i=0;i<M;i++)
        printf("%s\n",p[i]);
    return 0;
}
/*
12345
1234
123
12
1
 */

 

一维数组作参数,可以这样写void func(char *p){  }

也可以这样写void func(char p[]){  }  不需要指出数组大小

但是二维数组作参数,必须要指出第二维大小,即void func(char (*p)[20]){  }表示传递一个二维数组,且第二维大小为20

如果这样写void func(char  * p[20]){  }表示你传递一个一维数组,数组类型是char*

 

#include<stdio.h> 
#include<string.h>
#define M 5
#define N 20
void StrSort(char (*p)[N])
{
	int i,j,k,x[M];		char t[N];
	for(i=0;  i<M;  i++ )
		x[i]=strlen(p[i]);
		
	for(i=0;  i<M-1;  i++  )
	{	k=i;
		for(j=i+1;  j<M;  j++ )
			if(x[j]<x[i])	k=j;
		if(k!=i)
		{	strcpy(t,p[i]);
			strcpy(p[i],p[k]);
			strcpy(p[k],t);
			x[k]=x[i]; 
		}
	}
}

int main()
{
	char p[M][N];
	int i;
	for(i=0;i<M;i++)
		scanf("%s\n",p[i]); 
	StrSort(p);
	for(i=0;i<M;i++)
		printf("%s\n",p[i]); 
	return 0;
 }