【问题标题】:Point to specific rows of 2-D arrays指向二维数组的特定行
【发布时间】:2017-05-18 14:06:40
【问题描述】:

我编写了以下代码来指向二维数组的第一行。但是,当我这样做时

arrayPtr = & array[0];

我最终得到了

错误:无法在分配中将double (*)[1] 转换为double*

 arrayPtr = & array[0];

我的程序是:

#include <iostream>
    
int main(int argc, char **argv) 
{       
    double array[2][1];

    array[0][1] = 1.0;
    array[1][1] = 2.0;
    
    double* arrayPtr;
    arrayPtr = &array[0];
    
    return 0;
}

有人可以帮助我了解我哪里出错了吗?

【问题讨论】:

  • 不要垃圾标签。这不是 C。

标签: c++ c++11 variable-assignment addressof


【解决方案1】:

不用arrayPtr = &amp; array[0],你可以写

 arrayPtr = array[0];

利用数组衰减属性。

相关,

  • 引用 C11,第 §6.3.2.1 章,左值、数组和函数指示符

    除非它是sizeof 运算符、_Alignof 运算符或 一元 &amp; 运算符,或者是用于初始化数组的字符串文字,该表达式具有 type ''array of type'' 被转换成一个类型为 ''pointer to type'' 的表达式,它指向 到数组对象的初始元素并且不是左值。 [...]

  • 引用C++14,第 5.3.3 章

    左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换不是 应用于sizeof的操作数。

    并且,对于第 4.2 章,

    “N T 的数组”“T 的未知边界的数组” 类型的左值或右值可以转换为纯右值 “指向 T 的指针” 类型。结果是指向数组第一个元素的指针。

因此,当用作赋值运算符的 RHS 操作数时,array[0] 衰减为指向数组第一个元素的指针,即生成与 LHS 相同的类型 double*

否则,&amp; 运算符的使用可防止 array[0] 的数组衰减,array[0] 是一个类型为 double [1] 的数组。

因此,&amp;array[0] 返回一个类型,该类型是指向double [1] 数组的指针,或者,double (*) [1] 与分配,double *

【讨论】:

  • 有效,但为什么会这样?
  • 对不起,我还是没明白你说的“数组衰减”是什么意思
  • @AlexanderFell 现在好点了吗?
  • 简单:array 是 double**,array[y] 是 double*,array[y][x] 是 double。 &array[y][x] 是 double*,&array[y] 是 double** &array 是 double***。你想要一行,所以你想要一个双 *。 arrayPtr = 数组[y];
【解决方案2】:

在您的代码中:

  • arraydouble (*)[1] 类型;
  • array[0]double[1] 类型
  • &amp;array[0](等于array)的类型为double (*)[1](即指向double[1]的指针)

注意 1: T[] 可以衰减为 T*。所以在你的例子中double[] 可以衰减到double *

注意 2: a[b] == *(a + b),因此在您的示例中,&amp;array[0] 等于 &amp; (*(array + 0)),它本身被简化为 array

【讨论】:

    【解决方案3】:
    double array[2][1];
    double* arrayPtr;
    arrayPtr = & array[0];
    

    arrayPtr 具有类型

    POINTER (DOUBLE)
    

    array 具有类型

    POINTER(POINTER(DOUBLE))
    

    &amp;array[0] 有类型

    POINTER(POINTER(DOUBLE))
    

    你尝试分配

    POINTER (DOUBLE) <= POINTER(POINTER(DOUBLE))
    

    正确的做法是

    arrayPtr = array[0];
    

    arrayPtr = *array;
    

    【讨论】:

    • 您的第二个和第三个选项是错误的,因为它们不等于第一个。也许你的意思是arrayPtr = *array
    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多