假设我们有
int a[2][3] ;
int (*p)[3]=a; // is ok
int (*p)[3]=&a[0]; // is also ok
但为什么
int (*p)[3]=a[0];
产生错误,虽然a[0]
给出了第一个数组的地址(因为2d数组是数组的数组)并且似乎更多
好于&a[0]
给出第一个数组的第一个元素的地址仍然可以,但为什么?
答案 0 :(得分:5)
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of T
“将被转换(”衰减“)到”指向T
的指针“类型的表达式,表达式的值将是数组的第一个元素的地址。
鉴于声明
int a[2][3];
以下是真的:
Expression Type Decays To Equivalent Value
---------- ---- --------- ----------------
a int [2][3] int (*)[3] &a[0]
&a int (*)[2][3] n/a n/a
*a int [3] int * a[0]
a[i] int [3] int * n/a
&a[i] int (*)[3] n/a n/a
*a[i] int n/a a[i][0]
a[i][j] int n/a n/a
请注意,a
,&a
,*a
,a[0]
,&a[0]
和&a[0][0]
都会产生相同的值< / em>(数组的第一个元素的地址与数组的地址相同),但类型不同。
从上表中可以看出,表达式a[0]
的类型为“{-1}}的3元素数组”;由于该表达式不是int
或一元sizeof
运算符的操作数,因此它将转换为“指向&
的指针”类型的表达式,这与“指向<的指针不兼容” em> 3元素数组 int
“,这就是int
抛出错误的原因。
答案 1 :(得分:2)
因为a[0]
不是指针类型,而是int[3]
类型。一个3个整数的块,可以分配给它,但不能分配给指针。
答案 2 :(得分:2)
int (*p)[3]=a; // is OK
因为a
的类型为int (*)[3]
(指向3 int
s的数组的指针),在衰减到第一个元素后也是p
的类型。作业是合法的。
int (*p)[3]=&a[0]; // is also OK
因为&a[0]
也是int (*)[3]
类型(第一行的地址)
int (*p)[3]=a[0]; // is not OK
因为a[0]
在衰减到行int *
的第一个元素后属于0
类型。分配不同的指针类型是非法的。
答案 3 :(得分:0)
[0]如何为int或int [3]类型,因为我们已经声明它是一个二维数组