如何在C ++中将指针呈现的2D数组转换回2D数组?

时间:2013-05-07 08:38:06

标签: c++ arrays types casting

我在类中有一个变量,声明为已知大小的编译时常量:

static const int array[5][5]; // constants initlialised in another place

一个虚拟返回它的函数:

virtual const int** getArray() { return array; }

如何使用此方法获取此数组,并将其强制转换为固定大小的数组,而不是基于指针的数组,因此我可以像cout << data[2][2]一样使用它?

无法编译的示例:

const int[5][5] data = object->getArray();
cout << data[2][2]; 

编译但崩溃应用程序的示例:

const int** data = object->getArray();
cout << data[2][2]; 

注意:一个解决方案是创建typedef arr[5]并使用arr*声明方法但我不想为我使用的每个编译时大小创建一个typedef,如typedef arr5[5]; typedef arr10[10]等我正在寻找更像的东西:

const int(*)[5] data = object->getArray(); // won't compile, example only

假设编译时常量数组加载了动态DLL并且已经在内存中,是否可以将此数据用作数组而无需分配新内存并从编译时常量中填充它?

4 个答案:

答案 0 :(得分:2)

virtual const int** getArray() { return array; }

那不行,也不应该编译;你试图返回指向某些指针的指针,但是没有指向指针的指针,只有一个数组数组。

您可以返回指向这些数组的指针,保留类型:

virtual const int (*getArray())[5] { return array; }
const int (*data)[5] = getArray();
cout << data[2][2];

在C ++ 11中,在std::array中包装数组可能更好,并返回对它的引用,以避免一些讨厌的语法。

答案 1 :(得分:1)

使用std::array

#include <array>

static const std::array<std::array<int, 5>, 5> myarray; // constants initlialised in another place

virtual const std::array<std::array<int, 5>, 5>& getArray() const 
{ 
  return myarray; 
}

如果您没有C ++ 11支持,可以使用std::tr1::arrayboost::array(或推出自己的固定大小数组类型。)

答案 2 :(得分:0)

这是不可能的。当数组传递给函数或从函数返回时,您将丢失所有大小信息。数组衰减成指针,可以说

答案 3 :(得分:0)

这很简单,你几乎就在那里

const int(*)[5] data = reinterpret_cast<int(*)[5]>(object->getArray());