如何给指针赋予2d数组的基址

时间:2014-02-21 14:42:49

标签: c arrays

假设我们有

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]给出第一个数组的第一个元素的地址仍然可以,但为什么?

4 个答案:

答案 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*aa[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]类型,因为我们已经声明它是一个二维数组