如何创建指向具有未知大小的多维数组的指针?

时间:2009-02-09 20:06:54

标签: c++ arrays pointers multidimensional-array

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

int **triangles;

triangles = new int[numTriangles][3];

但是我收到了这个错误:

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

4 个答案:

答案 0 :(得分:4)

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>,其中Triangle是一个类:)

答案 1 :(得分:4)

好吧,错误信息说明:)如果你是一个新数组,那么new返回一个指向其第一个元素的指针。

多维数组只是数组数组的另一个名称。你创建了一个int[3]数组,并且正是这些数组的numTriangles元素。所以新功能是返回指向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)()")...

上更常见的用法

答案 2 :(得分:4)

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

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 :(得分:1)

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

int a[n][m];

相当于

int a[n*m];

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

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