声明指向多维数组并分配数组的指针

时间:2010-10-11 07:22:31

标签: c++ pointers multidimensional-array

我试过看,但我找不到任何明确的答案。我知道我的问题不会那么难。也许只是因为我累了..

基本上,我想声明一个指向二维数组的指针。我想这样做,因为最终我将不得不调整数组的大小。我使用一维数组成功完成了以下操作:

int* array;
array = new int[somelength];

我想用2D数组执行以下操作但不会编译:

int* array;
array = new int[someheight][somewidth];

编译器给出了一个错误,指出'somewidth'不能出现在常量表达式中。我已经尝试了**和[] []的各种组合,但它们似乎都没有用。我知道这并不复杂......感谢任何帮助。

6 个答案:

答案 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] ; 
    }
}