正确转换二维数组的成员变量

Posted

技术标签:

【中文标题】正确转换二维数组的成员变量【英文标题】:Properly casting a member variable for a 2D array 【发布时间】:2014-02-22 19:47:49 【问题描述】:

我收到编译错误,因为我无法正确地将类成员变量指定为指向二维数组的指针。该板有许多接收指向 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.

;

【问题讨论】:

【参考方案1】:

当你声明参数时

int* _2dIn[3]

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

您必须使用括号来获得正确的含义:

int (*_2dIn)[3]

【讨论】:

它有效。谢谢,两个答案都是正确的。这篇文章直截了当。【参考方案2】:

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

您可以将参数传递给构造函数int _2dIn[][3],但这实际上只是变相的int (*_2dIn)[3] - 即指向数组的指针。当你传入二维数组时,它会自动进行数组到指针的转换,你会得到一个指向第一个元素的指针。如果您随后使成员具有相同的类型,则根本不需要转换任何内容。

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

【讨论】:

以上是关于正确转换二维数组的成员变量的主要内容,如果未能解决你的问题,请参考以下文章

关于为成员变量是二维数组的赋值而导致推箱子游戏回退上一步失败的问题

使用 const 成员变量索引数组

在构造函数中初始化成员变量二维向量

内存的基本结构 图片

C语言结构体里的成员数组和指针

mfc怎么设置全局变量