如何在C++中分配2D指针数组

The*_*uzz 12 c++ pointers allocation multidimensional-array

我正在尝试使指针指向2D数组指针.什么是语法以及如何访问元素?

Dre*_*all 22

根据法律条文,这是如何做到的:

// Create 2D array of pointers:
int*** array2d = new (int**)[rows];
for (int i = 0; i < rows; ++i) {
  array2d[i] = new (int*)[cols];
}

// Null out the pointers contained in the array:
for (int i = 0; i < rows; ++i) {
  for (int j = 0; j < cols; ++j) {
    array2d[i][j] = NULL;
  }
}
Run Code Online (Sandbox Code Playgroud)

请小心删除包含的指针,行数组和列数组,并按正确顺序删除.

但是,在C++中更频繁地创建一个内部管理一维指针数组的类,并重载函数调用操作符以提供2D索引.这样你就会有一个连续的指针数组,而不是一个指针数组.

  • @Crahsworks:是的。如果它像鸭子一样嘎嘎叫,那就是鸭子。 (2认同)

Cra*_*rks 5

int *pointerArray[X][Y];
int **ptrToPointerArray = pointerArray;
Run Code Online (Sandbox Code Playgroud)

这就是你如何制作一个真正的(在内存中连续的)多维数组。

但是要意识到,一旦将多维数组转换为这样的指针,就失去了自动索引它的能力。您必须手动执行索引的多维部分:

int *pointerArray[8][6]; // declare array of pointers
int **ptrToPointerArray = &pointerArray[0][0]; // make a pointer to the array
int *foo = pointerArray[3][1]; // access one element in the array
int *bar = *(ptrToPointerArray + 3*8 + 1); // manually perform row-major indexing for 2d array

foo == bar; // true
int *baz = ptrToPointerArray[3][1]; // syntax error
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 5

这取决于。它可以很简单:

int main()
{
    int*   data1[10][20]; // Fixed size known at compile time

    data1[2][3] = new int(4);
}
Run Code Online (Sandbox Code Playgroud)

如果要在运行时动态调整大小,则需要做一些工作。
但是Boost涵盖了:

int main()
{
   int  x;
   int  y;
   getWidthAndHeight(x,y);

   // declare a 2D array of int*
   boost::multi_array<int*,2>   data1(boost::extents[x][y]);

   data[2][3] = new int(6);
}
Run Code Online (Sandbox Code Playgroud)

如果您对可以动态增长的锯齿状数组感到满意,请执行以下操作:

int main()
{
    std::vector<std::vector<int*> >   data1;

    data1.push_back(std::vector<int*>(10,NULL));
    data1[0][3] = new int(7);
}
Run Code Online (Sandbox Code Playgroud)

注意:以上所有内容。我假设数组不拥有指针。因此,它没有对其包含的指针进行任何管理(尽管为简洁起见,我在示例中一直使用new int())。要正确执行内存管理,您需要做更多的工作。