【问题标题】:How do I make a pointer to a multidimensional array which has an unknown size?如何创建一个指向大小未知的多维数组的指针?
【发布时间】:2010-10-06 11:51:03
【问题描述】:

如何创建一个指向大小未知的多维数组的指针?我试过这个:

int **triangles;

triangles = new int[numTriangles][3];

但我得到这个错误:

cannot convert 'int (*)[3]' to 'int**' in assignment

【问题讨论】:

  • 您可能想要编辑问题的名称。数组拼写错误,问题名称远比实际问题通用。

标签: c++ arrays pointers multidimensional-array


【解决方案1】:
triangles = new int[numTriangles*3];

然后访问它:

triangles[numTriangles*triangleIndex+vertexIndex] = blah;

但这很乏味且容易出错,所以我建议改用boost.multi_array,或者自己滚动(真的很简单):

template<class T>
class Matrix {
public:
    Matrix(int _w, int _h) : data(_w*_h), w(_w), h(_h) {
    }

    T      & operator()(int x, int y)       { return data[y * w + x]; }
    T const& operator()(int x, int y) const { return data[y * w + x]; }

private:
    std::vector<T> data;
    int w, h;
};

// usage:
int main() {
    Matrix<float> triangles(numTriangles, 3);
    triangles(triangleIndex, vertexIndex) = blah;
}

另一方面,如果您实际上想要一个三角形数组,而不是二维数组,只需使用 vector&lt;Triangle&gt; 其中 Triangle 是一个类 :)

【讨论】:

  • 谢谢,我想我会使用第一个例子,尽量保持简单;)
  • 哦,一旦你真正开始用这种方式编码,它就会变得非常复杂;)
  • 是的,如果您不喜欢其他建议之一。
【解决方案2】:

为此,您必须循环一个维度并为另一个维度分配空间:

int** triangles;
triangles = new int*[NUMROWS];

for (int i = 0; i < NUMROWS; i++) {
   triangles[i] = new int[NUMCOLS];
}

但是这样做时要小心,你必须这样做才能释放内存。

for (int i = 0; i < NUMROWS; i++) {
   delete [] triangles[i];
   triangles[i] = 0;
}
delete [] triangles;
triangles = 0;

【讨论】:

  • 我不会说这就是他“做”的方式。他一次性分配了一个多维数组(数组的数组)。这些内存是连续的,也可以一次性释放。你的是分配一个指针数组,使它们指向不相关的内存。这不一样。你应该提到这一点。
【解决方案3】:

嗯,错误信息是这样说的:) 如果你'new 一个数组,那么 new 返回一个指向它的第一个元素的指针。

多维数组只是数组数组的另一个名称。你'newed 了一个int[3] 的数组,以及其中的numTriangles 个元素。所以 new 所做的就是返回一个指向 int[3] 的指针。您将结果分配给的变量必须具有该类型,即指向 3 个整数数组的指针:

int (*triangles)[3];
triangles = new int[numTriangles][3];
triangles[triangleIndex][vertexIndex] = 42;

当然,typedef 在这里也有帮助:

typedef int triangles_t[3];
triangles_t * triangles = new int[numTriangles][3];

由于 C++ 优先规则,需要括号。他们告诉编译器它不是创建一个由三个指向整数的指针组成的数组,而是一个指向一个由 3 个整数组成的数组的指针。这类似于函数指针上更常见的用法("void (*funptr)()")...

【讨论】:

  • 我试图记住如何按照您在回答中的方式进行操作(使用投射),但在您发布之前不记得了。 Iraimbilanja 的模板和您的方法可能是最好的选择。我的可能是最接近完全按照要求回答的问题。
  • 嗯铸造?我没有看到铸造:)
  • 我的意思是 (*triangles)[3];不知道你会怎么称呼它。
  • Scottie,它不是强制转换,而是将“*”绑定到标识符“triangles”而不是类型“int”。我在最后一句话中解释了。这是因为 C++ 中的优先规则,您需要这些括号
  • 首先我以为你想说你是通过强制转换来完成的,所以我没有对你的评论发表评论:p 但似乎你认为“(* triangles)[3]" 实际上正在执行强制转换 :) 你可能在定义函数指针时也看到过它:void (*funptr)();
【解决方案4】:

c++ 中的多维数组只是语法糖。

int a[n][m];

等价于

int a[n*m];

所以你只需要一个常规指针 - 即:

int *triangles;
triangles = new int[numTriangles*3];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2010-11-06
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多