正确转换 2D 数组的成员变量

Properly casting a member variable for a 2D array

本文关键字:成员 变量 数组 2D 转换      更新时间:2023-10-16

我收到编译错误,因为我无法正确指定类成员变量作为指向 2D 数组的指针。 该板有许多接收指向 2D 数组的指针的示例,但在每种情况下,指针都会立即用于访问数组中的数据,这不是我正在做的事情。 我想保存指向 2D 数组的指针,以便在类中常规使用。 我无法确定正确的演员表。

无论我尝试什么,我都会收到这样的错误。 错误 C2440:"类型转换":无法从 ... 自。。。

此外,我无法将成员变量分配给 NULL。

我正在使用MS VC++ 2008 Express。

这是我的代码,简化:

int _tmain(int argc, _TCHAR* argv[])
{
  int _2D[2][3] = { {1,2,3}, {11,22,33} };
  return 0;
}
class C
{
 public:
    C(int* _2dIn[3]) {                  // <- I don't know how to cast this properly.
        init();
    m_p2d = (int *[3])_2dIn;    // <-  The casting error always points to this line.
    }
    ~C(void);
    void init(void) {
        m_p2d = NULL;              // <- This is my second problem.
    }
private:
    int* m_p2d[3];                     // <- And I don't know how to specify this either.
};

当您声明参数时

int* _2dIn[3]

您实际上声明了一个指针数组,而不是指向数组的指针。

你必须使用释义来获得正确的含义:

int (*_2dIn)[3]

您的问题是该成员是指向int的指针数组,其布局与 2D 数组不同(2D 数组中没有指针)。

你可以向构造函数int _2dIn[][3]参数,但这实际上只是一个伪装的int (*_2dIn)[3] - 即指向数组的指针。当您传入 2D 数组时,它会自动进行数组到指针的转换,并且您将获得指向第一个元素的指针。如果随后将成员设置为相同类型,则根本不需要强制转换任何内容。

但是,处理这样的数组可能会给您带来麻烦。如果 C 对象的寿命超过传递给它的数组,它将持有指向无效对象的指针。相反,您应该考虑使用标准容器类型,例如 std::arraystd::vector