为什么在分配指向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;
其中T
是char[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;