下面这段代码有几个地方不懂


#include <stdio.h>
#include <string.h>
main()
{
    char str[20][10],t[20],str1[10];
    int i,j,n=0;
    while(1)
    {
        scanf("%s",str1);  //每次输入的时候是把那串字符串先放在str1[0]的位置吗,下次输入再覆盖
        if(str1[0]=='#')
        {
            break;
        }
        else
        {
        strcpy(str[n],str1);  //strcpy的一般用法为strcpy(字符数组1,字符串2),字符数组1不是必须写成数组名的形式吗,这里的str[n]是什么意思,定义str的时候也是一个二维数组
        n++;
        }
    }
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        {
            if(strlen(str[j])>strlen(str[j+1]))  //同样,str不是一个二维数组名吗,这里是一维
            {
               strcpy(t,str[j]);
               strcpy(str[j],str[j+1]);
               strcpy(str[j+1],t);
            }
        }
    for(i=0;i<n;i++)
    {
        printf("%s ",str[i]);
    }
}

二维数组不是也可以看成一维数组的数组吗,char str[20][10]相当于20个长度为10的一维字符数组,在c里一般用字符数组接收字符串,所以str[20][10]也相当于20个字符串,每个字符串最大长度为10