假设我们有
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]
给出了第一个数组的地址(因为二维数组是数组的数组)并且看起来更多
好吧 &a[0]
给出第一个数组的第一个元素的地址仍然没问题,但为什么呢?
最佳答案
除非它是 sizeof
或一元 &
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,类型的表达式“T
的 N 元素数组”将被转换(“衰减”)为“指向 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]
都产生相同的值(数组第一个元素的地址与地址相同数组),但类型不同。
从上表可以看出,表达式a[0]
的类型为“int
的三元素数组”;由于该表达式不是 sizeof
或一元 &
运算符的操作数,因此它被转换为“指向 int
的指针”类型的表达式,这与“指向 int
的 3 元素数组”不兼容,这就是为什么 int (*p)[3] = a[0];
抛出错误。
关于c - 如何将二维数组的基地址赋给指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937435/