C语言中的二维字符数组

C语言中的二维字符数组,c,C,在下面的代码中 char strArr[5][20]; int i; for(i=0; i<5; i++) { printf("string %d: ", i+1); gets(strArr[i]); } strArr[0]=strArr[1]; //have an compile error on this line. Why cannot assign? charstrarr[5][20]; int i; 对于(i=0;i左右操作数的类型都是char[

在下面的代码中

char strArr[5][20];
int i;

for(i=0; i<5; i++)  
{  
   printf("string %d: ", i+1);  
   gets(strArr[i]);  
}

strArr[0]=strArr[1]; //have an compile error on this line. Why cannot assign?
charstrarr[5][20];
int i;

对于(i=0;i左右操作数的类型都是
char[20]
,而不是
char*
。变量实际上为它们保留了存储空间,它们不仅仅是指向字符串的指针。因此,如果合法的话,赋值就是将20个字符从一个数组复制到另一个数组

C不允许使用赋值运算符复制数组。请改用
strcpy
strncpy
memcpy


(我怀疑这个错误的具体措辞是因为数组在某些位置衰减为指针,我希望赋值的左侧不是这些位置之一,而在赋值的右侧使用的是。)

char array[n][m]
:在几乎所有语言中,它的意思是:数组的数组。因此,
array[0]
数组[1]
…是一个数组。实际上,它是指向每个元素的连续内存的指针

此数组的类型为:
char[m]
。当您写入:
arrayX=arrayY
时,您希望将arrayY中的所有值复制到arrayX,但C不允许这样做。您必须手动复制:

for(int i=0; i<=sizeof(arrayX)/sizeof(char); i++)
      arrayX[i] = arrayY[i];
但是,如果您这样声明,则没有编译错误:

char*strArray[5][10]

因为,它只是复制指针的值:意思是复制指针指向的位置。但当然,它会极大地改变您的代码。我只是在这里画图以更清楚


希望获得以下帮助:)

您正在尝试将字符数组strArray[0]的基址更改为strArray[1]的基址,这是不允许的。
因此会出现错误。

使用fgets()代替gets(),以避免缓冲区溢出。fgets(strArr[i],20,stdin)。您的问题与2D数组无关。它只是关于数组本身。
strcpy
仅在数组包含以null结尾的stringchar*str1=“CPointer”时才起作用;char*str2=“C++指针”;str1=str2;没有编译错误。我想你可以更改基址。编译器说这个问题是由不兼容的类型引起的。
 memcpy (strArray[1],strArray[0],sizeof(strArr[0]));