[英]C++ multidimensional array member accessor
我有一个类,里面有一个大的二维数组。 它曾经是一个在堆上分配的动态数组,现在它是我更喜欢的静态大小。
private:
int fontTextureCoords_[100][7];
我必须将类型转换添加到访问器,以便返回数组以供当前工作正常的类之外的访问,但我不确定它是否安全或处理此问题的正确方法。
public:
inline int **getFontTextureCoords()
{
return (int**)fontTextureCoords_;
}
这是安全的/正确的方法还是有更首选的方法来返回指向多维数组的指针?
这不是正确的方法,不应该编译。 二维数组不可转换为指向指针的指针。 您必须返回一个指向数组的指针,这是使用 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>
。
投射一个数组,例如int fontTextureCoords_[100][7];
到int**
是不对的。 它会导致未定义的行为。
如果不是太多,将getFontTextureCoords
更改为:
inline int (*getFontTextureCoords()) [7]
{
return fontTextureCoords_;
}
并将其用作:
int (*ptr)[7] = getFontTextureCoords();
如果您可以选择使用std::vector
或std::array
,最好使用它们。
C/C++ 中没有多维数组。 只有单维数组。 你可以有一个一维数组,它的每个元素都是另一个一维数组。 虽然似乎没有区别,但它确实存在并且非常重要。
这正是传递逻辑不起作用的方式。 每个人都经历过。 '如果一维数组作为指向第一个元素的指针传递,二维数组应该作为指向第一个元素的指针的指针传递,等等'。 但由于它不是二维数组,而是数组的数组,因此无法应用该逻辑。
您可以通过以下方式进行推理。 假设您有一个类型为 X 的数组。
X x[10];
如何访问第 5 号元素? 简单 -
x[5] = 42;
但是编译器看到它时会做什么呢? 它大约是这样:
*(&x[0] + 5) = 42;
所以它需要第一个元素的地址,然后加上 5 来得到你的第 5 个元素的地址。 但是加 5 意味着什么? 以字节为单位,应该从数组的开头地址跳过多少字节才能到达请求的内存位置? 当然,5 * sizeof(X)。 现在,如果你有 '2-D' 数组,声明如下:
X x[2][3];
您尝试通过指向指针的指针来使用它:
px = (X**)x;
px[3][4] = 42;
请记住,要生成 [][] 的代码,编译器需要以 *(px + ) 的方式表示。 并且某些东西必须是数组的大小(因为数组的元素是数组)。 但是您需要为此知道数组大小,并且如您所见,您的 px 中没有编码任何数组大小。 它知道的唯一大小是 X 的大小,这还不够。
希望这是有道理的,并解释了为什么不能使用 int** 而不是 x[][]。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.