繁体   English   中英

C++ 多维数组成员访问器

[英]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>

也许这张图向您展示了两种类型的多维数组声明之间的区别。 (有时人们不明白这一点。)

在此处输入图片说明

第一个表示a是100个连续7-单个块int块,或700个ints TOTAL,在一块都在一起。

第二个说a是一个指针数组,其中每个指针指向一个不同的ints块,分散在整个内存中。

编译器需要知道这一点,因为如果你写a[i][j]它必须生成完全不同的代码。

投射一个数组,例如int fontTextureCoords_[100][7]; int**是不对的。 它会导致未定义的行为。

如果不是太多,将getFontTextureCoords更改为:

inline int (*getFontTextureCoords()) [7]
{   
    return fontTextureCoords_;
}

并将其用作:

int (*ptr)[7] = getFontTextureCoords();

如果您可以选择使用std::vectorstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM