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索引.这样你就会有一个连续的指针数组,而不是一个指针数组.
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)
这取决于。它可以很简单:
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())。要正确执行内存管理,您需要做更多的工作。