我正在尝试将指针指向2D指针数组。什么是语法以及如何访问元素?
答案 0 :(得分:20)
根据法律条文,这是如何做到的:
// 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;
}
}
小心删除包含的指针,行数组和列数组,并按正确顺序删除。
但是,在C ++中更频繁地创建一个内部管理一维指针数组的类,并重载函数调用操作符以提供2D索引。这样你就会有一个连续的指针数组,而不是一个指针数组。
答案 1 :(得分:4)
int *pointerArray[X][Y];
int **ptrToPointerArray = pointerArray;
这就是你如何制作一个真正的(连续的内存)多维数组。
但是要意识到,一旦将多维数组转换为类似指针,就会失去自动索引的能力。您必须手动执行索引的多维部分:
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
答案 2 :(得分:4)
这取决于。它可以很简单:
int main()
{
int* data1[10][20]; // Fixed size known at compile time
data1[2][3] = new int(4);
}
如果您想在运行时使用动态尺寸,则需要做一些工作 但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);
}
如果你可以动态增长的jagged arrays:
int main()
{
std::vector<std::vector<int*> > data1;
data1.push_back(std::vector<int*>(10,NULL));
data1[0][3] = new int(7);
}
注意:以上所有内容。我假设数组不拥有指针。因此它没有对它包含的指针进行任何管理(尽管为了简洁起见,我在示例中一直使用新的int())。要正确地进行内存管理,您需要做更多的工作。
答案 3 :(得分:3)
double** array = new double*[rowCnt];
for (int row = 0; row < rowCnt; ++row)
array[row] = new double[colCnt];
for (int row = 0; row < rowCnt; ++row)
for (int col = 0; col < colCnt; ++col)
array[row][col] = 0;
答案 4 :(得分:3)
您可以尝试Boost :: MultiArray。
查看此page了解详情。
答案 5 :(得分:1)
您可以定义矢量矢量:
typedef my_type *my_pointer;
typedef vector<vector<my_pointer> > my_pointer2D;
创建一个派生自my_pointer2D的类,如:
class PointersField: public my_pointer2D
{
PointsField(int n, int m)
{
// Resize vectors....
}
}
PointsField pf(10,10); // Will create a 10x10 matrix of my_pointer
答案 6 :(得分:1)
:)
我曾在一段代码中写过这些内容。
当第一个漏出来时,我是团队的笑柄。最重要的是,我们使用匈牙利表示法,导致类似papChannel
的名称 - 指向指针数组的指针......
这不好。使用typedef定义“行列”更好,反之亦然。使索引更清晰。
typedef int Cell;
typedef Cell Row[30];
typedef Row Table[20];
Table * pTable = new Table;
for( Row* pRow = *pTable; pRow != *pTable+_countof(*pTable); ++pRow ) {
for( Cell* pCell = *pRow; pCell != *pRow + _countof(*pRow); ++pCell ) {
... do something with cells.
}
}
答案 7 :(得分:1)
我更喜欢使用()运算符。这有很多原因(C ++ FAQs 13.10)。如果您愿意,可以将内部表示更改为std::vector
:
template <class T, int WIDTH, int HIEGHT>
class Array2d
{
public:
const T& operator ()(size_t col, size_t row) const
{
// Assert col < WIDTH and row < HIEGHT
return m_data [( row * WIDTH + col)];
}
T& operator ()(size_t col, size_t row)
{
// Assert col < WIDTH and row < HIEGHT
return m_data [( row * WIDTH + col)];
}
private:
T m_data[WIDTH * HIEGHT];
};
你可以像这样使用它:
Array2d< Object*, 10, 10 > myObjectArray;
myObjectArray(5,6) = new Object();
答案 8 :(得分:0)
查看我的代码。它适用于我的FC9 x86_64系统:
#include <stdio.h>
template<typename t>
struct array_2d {
struct array_1d {
t *array;
array_1d(void) { array = 0; }
~array_1d()
{
if (array) {
delete[] array;
array = 0;
}
}
t &operator[](size_t index) { return array[index]; }
} *array;
array_2d(void) { array = 0; }
array_2d(array_2d<t> *a) { array = a->array; a->array = 0; }
void init(size_t a, size_t b)
{
array = new array_1d[a];
for (size_t i = 0; i < a; i++) {
array[i].array = new t[b];
}
}
~array_2d()
{
if (array) {
delete[] array;
array = 0;
}
}
array_1d &operator[](size_t index) { return array[index]; }
};
int main(int argc, char **argv)
{
array_2d<int> arr = new array_2d<int>;
arr.init(16, 8);
arr[8][2] = 18;
printf("%d\n",
arr[8][2]
);
return 0;
}
Effo UPD:对“不是指向数组的指针数组?”的响应,添加了指针数组的示例,非常简单:
int main(int argc, char **argv)
{
array_2d<int*> parr = new array_2d<int*>;
int i = 10;
parr.init(16, 8);
parr[10][5] = &i;
printf("%p %d\n",
parr[10][5],
parr[10][5][0]
);
return 0;
}
我是否仍然误解了你的问题?
你甚至可以
typedef array_2d<int*> cell_type;
typedef array_2d<cell_type*> array_type;
int main(int argc, char **argv)
{
array_type parr = new array_type;
parr.init(16, 8);
parr[10][5] = new cell_type;
cell_type *cell = parr[10][5];
cell->init(8, 16);
int i = 10;
(*cell)[2][2] = &i;
printf("%p %d\n",
(*cell)[2][2],
(*cell)[2][2][0]
);
delete cell;
return 0;
}
它也适用于我的FC9 x86_64系统。