c - 如何将二维数组的基地址赋给指针

标签 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] 给出了第一个数组的地址(因为二维数组是数组的数组)并且看起来更多 好吧 &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 的指针”类型的表达式,这与“指向 int3 元素数组”不兼容,这就是为什么 int (*p)[3] = a[0]; 抛出错误。

关于c - 如何将二维数组的基地址赋给指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937435/

相关文章:

c++ - 读取数组末尾 : running in terminal vs. 调试器

c - 在 C 中创建一个数组来保存字符数组的数组

计算 2D 和 3D 网格中数量的导数

c - fork() 导致为每个进程打印列标题

c - C传递结构作为函数参数

php - 将 key=>value 对添加到具有条件的现有数组

c - 在C中使用数组时出错

Python 列表([])和 []

c - 指针转换是否依赖于平台?

关于 if 语句和 strcmp 与字符串的混淆