我有一个类中有一个大的二维数组。它曾经是在堆上分配的动态数组,现在它是我更喜欢的静态大小。
private:
int fontTextureCoords_[100][7];
我必须将类型转换添加到访问器中,以便返回数组以便在类之外进行访问,目前正常工作正常,但我不确定它是安全的还是正确的方法来处理它。
public:
inline int **getFontTextureCoords()
{
return (int**)fontTextureCoords_;
}
这样做是否安全/正确?还是有更优选的方法将指针返回到多维数组?
答案 0 :(得分:4)
2d数组不能转换为指针指针。您必须返回一个指向数组的指针,这是使用typedef编写最容易的:
using T = int[7];
inline T* getFontTextureCoords() { return fontTextureCoords_; }
虽然返回完整数组的引用要好得多:
using T = int[100][7];
inline T& getFontTextureCoords() { return fontTextureCoords_; }
您也可以std::array<std::array<int, 7>, 100>
。
答案 1 :(得分:1)
也许这个图表显示了两种类型的多维数组声明之间的区别。 (有时人们不理解这一点。)
第一个说a
是一个由100个连续的7个int
块组成的单个块,或者总共700 ints
个块,所有这些块都是一个整体。
第二个说a
是一个指针数组,其中每个指针指向不同的ints
块,散布在整个内存中。
编译器需要知道这一点,因为如果你编写a[i][j]
,它必须生成完全不同的代码。
答案 2 :(得分:0)
将int fontTextureCoords_[100][7];
等数组投射到int**
是不对的。它会导致不确定的行为。
如果不是太多,请将getFontTextureCoords
更改为:
inline int (*getFontTextureCoords()) [7]
{
return fontTextureCoords_;
}
并将其用作:
int (*ptr)[7] = getFontTextureCoords();
如果您可以选择使用std::vector
或std::array
,则最好使用它们。
答案 3 :(得分:0)
C / C ++中没有多维数组。只有单个维度的数组。您可以拥有一维数组,其中每个元素都是另一个单维数组。虽然似乎没有区别,但它确实存在并且非常重要。
这正是传递逻辑不起作用的方式。每个人都经历过这一切。 &#39;如果将一维数组作为指向第一个元素的指针传递,则应将2-D数组作为指向第一个元素的指针传递,等等。但由于它不是二维数组,而是数组数组,因此无法应用逻辑。
您可以通过以下方式对其进行推理。让我们说,你有一个类型X的数组。
WindowsBase
如何访问5号元素?容易 -
X x[10];
但编译器在看到它时会做什么?它大致是这样的:
x[5] = 42;
所以它需要第一个元素的地址,并为它添加5来获取第5个元素的地址。但是添加5意味着什么?以字节为单位,应该从数组开头的地址跳过多少字节才能到达请求的内存位置?当然,5 * sizeof(X)。现在,如果你有2-D&#39;数组,声明如下:
*(&x[0] + 5) = 42;
你尝试通过指向指针的方法来处理它:
X x[2][3];
请记住,为了生成[] []的代码,编译器需要以*(px +)的方式表达。并且某些东西必须是数组的大小(因为数组的元素是数组)。但是你需要知道这个数组的大小,正如你所看到的,你的px没有编码任何数组大小。它知道的唯一尺寸是X的大小,这还不够。
希望它有意义,并解释为什么你不能使用int **而不是x [] []。