当没有提到二维数组的行时,编译器声明“从不兼容的指针类型赋值”,我一直认为没有括号的数组表示第一个元素的地址,在这种情况下是元素 twodstring[0] 的地址[0]
当提到该行时,编译器不会指出错误,我想知道为什么会这样?
#include<stdio.h>
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
的对象。
关于c - 为什么在为二维数组分配指针时需要指定行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47081504/