为什么在分配指向2D数组的指针时需要指定行?

当没有提到2D数组的行时,编译器声明“从不兼容的指针类型赋值”,我一直认为没有括号的数组意味着第一个元素的地址,在这种情况下是元素的地址twodstring [0] [0]

当提到行时,编译器没有说出错误,我想知道为什么会这样?

#include int main() { char onedstring[]={"1D Array"}; char twodstring[][5]={"2D","Array"}; char *p1,*p2; p1=onedstring; p2=twodstring; p2=twodstring[1]; } 

二维数组

 char a[M][N]; 

可以使用typedef以下列方式声明

 typedef char T[N]; T a[M]; 

因此,可以声明指向数组a的第一个元素的指针

 T *p = a; 

其中Tchar[N]类型的别名。 现在我们可以编写反向替换

 char ( *p )[N] = a; 

那是二维数组的元素是一维数组。

这个宣言

 char ( *p )[N] = a; 

相当于

 char ( *p )[N] = &a[0]; 

其中a[0]的类型为char[N] 。 所以指针指向数组的第一个“行”。

取消引用指针,您将获得char[N]类型的对象。

注意可以声明二维数组

 char ( a[M] )[N]; 

所以用一维数组声明符替换a[M]代替你得到的指针

 char ( a[M] )[N]; char ( *p )[N] = a; 

如果你要声明这样的指针

 char *p1; 

那么你可以写一些例子

 p1 = a[1]; 

在该表达式中a[1]char[N]类型的一维数组。 使用表达式作为初始化程序,数组将转换为指向其第一个元素char *指针。

所以这个表达式声明

 p1 = a[1]; 

相当于

 p1 = &a[1][0]; 

取消引用此指针,您将获得char类型的对象。

我们来看看以下几行:

 char twodstring[][5]={"2D","Array"}; char *p2; p2=twodstring; 

在最后一行中,您只需编写数组的标识符。 这将计算指向第一个数组元素的指针。 但是第一个数组元素没有char类型 – 它是一个类型为char [5]的数组本身。

如果您希望此分配起作用,则必须使用正确的类型声明p2 ,如下所示:

 char twodstring[][5]={"2D","Array"}; char (*p2)[5]; p2=twodstring;