如何创建一个指向大小未知的多维数组的指针?我试过这个:
int **triangles;
triangles = new int[numTriangles][3];
但我得到这个错误:
cannot convert 'int (*)[3]' to 'int**' in assignment
如何创建一个指向大小未知的多维数组的指针?我试过这个:
int **triangles;
triangles = new int[numTriangles][3];
但我得到这个错误:
cannot convert 'int (*)[3]' to 'int**' in assignment
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<Triangle>
where Triangle 是一个类 :)
好吧,错误消息说:) 如果您 'new 一个数组,则 new 返回一个指向其第一个元素的指针。
多维数组只是数组数组的另一个名称。您新添加了一个数组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)()"
) 上更常见的用法......
为此,您必须遍历一个维度并为另一个维度分配空间:
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;
c++ 中的多维数组只是语法糖。
int a[n][m];
相当于
int a[n*m];
所以你只需要一个常规指针 - 即:
int *triangles;
triangles = new int[numTriangles*3];