当没有提到2D数组的行时,编译器声明“从不兼容的指针类型赋值”,我一直认为没有括号的数组意味着第一个元素的地址,在这种情况下是元素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];
}
答案 0 :(得分:6)
二维数组
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
类型的对象。
答案 1 :(得分:5)
让我们看看以下几行:
char twodstring[][5]={"2D","Array"};
char *p2;
p2=twodstring;
在最后一行中,您只需编写数组的标识符。这将计算指向第一个数组元素的指针。但是第一个数组元素没有类型char
- 它是一个类型为char [5]
的数组本身。
如果您希望此作业有效,则必须使用正确的类型声明p2
,如下所示:
char twodstring[][5]={"2D","Array"};
char (*p2)[5];
p2=twodstring;