我试过看,但我找不到任何明确的答案。我知道我的问题不会那么难。也许只是因为我累了..
基本上,我想声明一个指向二维数组的指针。我想这样做,因为最终我将不得不调整数组的大小。我使用一维数组成功完成了以下操作:
int* array;
array = new int[somelength];
我想用2D数组执行以下操作但不会编译:
int* array;
array = new int[someheight][somewidth];
编译器给出了一个错误,指出'somewidth'不能出现在常量表达式中。我已经尝试了**和[] []的各种组合,但它们似乎都没有用。我知道这并不复杂......感谢任何帮助。
答案 0 :(得分:43)
const int someheight = 3;
const int somewidth = 5;
int (*array)[somewidth] = new int[someheight][somewidth];
答案 1 :(得分:13)
我刚刚发现这个古老的答案仍然被阅读,这是一个耻辱,因为它是错的。改为使用所有投票来查看the answer below。
读取指针语法,需要一个数组数组。这与指针的指针是一样的。
int width = 5;
int height = 5;
int** arr = new int*[width];
for(int i = 0; i < width; ++i)
arr[i] = new int[height];
答案 2 :(得分:6)
来自here的一个随时可用的示例,在使用短语“二维动态数组”进行谷歌搜索几秒后:
int **dynamicArray = 0;
// memory allocated for elements of rows.
dynamicArray = new int *[ROWS];
// memory allocated for elements of each column.
for( int i = 0 ; i < ROWS ; i++ ) {
dynamicArray[i] = new int[COLUMNS];
}
// free the allocated memory
for( int i = 0 ; i < ROWS ; i++ ) {
delete [] dynamicArray[i];
}
delete [] dynamicArray;
答案 3 :(得分:6)
我建议使用比数组数组更简单的方法:
#define WIDTH 3
#define HEIGHT 4
int* array = new int[WIDTH*HEIGHT];
int x=1, y=2, cell;
cell = array[x+WIDTH*y];
我认为这是一种比数组数组更好的方法,因为分配的数量要少得多。你甚至可以编写一个辅助宏:
#define INDEX(x,y) ((x)+(WIDTH*(y)))
int cell = array[INDEX(2,3)];
答案 4 :(得分:2)
就个人而言,我的偏好是使用语法技巧来声明指向动态大小的多维数组的指针。这适用于支持可变长度数组(VLA)的编译器,所有C ++编译器都应该这样,以及大多数当前的C编译器。
基本理念如下:
void bar (int *p, int nz, int ny, int nx) {
int (*A)[ny][nx] = (int(*)[ny][nx]) p;
“p”指向要作为多维数组处理的(连续)空间块。 “A”具有与“p”相同的值,但声明使编译器以您想要的多维方式处理对“A”的引用。 例如:
#include <iostream>
using namespace std;
void bar (int *p, int nz, int ny, int nx)
{
int (*A)[ny][nx] = (int(*)[ny][nx]) p;
for (int ii = 0; ii < nz; ii++) {
for (int jj = 0; jj < ny; jj++) {
for(int kk = 0; kk < nx; kk++) {
A[ii][jj][kk] = ii*1000000 + jj*1000 + kk;
}
}
}
}
void out (int *p, int nz, int ny, int nx)
{
int (*A)[ny][nx] = (int(*)[ny][nx]) p;
cout << A[11][22][33] << endl;
}
int main (void)
{
int NX = 97;
int NY = 92;
int NZ = 20;
int *space = new int [NZ * NY * NX];
bar (space, NZ, NY, NX);
out (space, NZ, NY, NX);
return 0;
}
运行它会产生输出“11022033”
“A”别名的声明看起来有点奇怪,但它允许您直接和简单地使用所需的多维数组语法
答案 5 :(得分:1)
我认为这样做
int r, c ;
std::cin>>r>>c ;
int *array = new int[r*c] ;
您可以通过执行此类操作来输入值
for (int i = 0 ; i < r ; i++){
for (int j = 0 ; j < c ; j++){
std::cin>>array[i *c + j] ;
}
}