Подтвердить что ты не робот

Объявление указателя на многомерный массив и выделение массива

Я пробовал смотреть, но я ничего не нашел с окончательным ответом. Я знаю, что моя проблема не может быть такой сложной. Может быть, это просто, что я устал..

В принципе, я хочу объявить указатель на 2-мерный массив. Я хочу сделать это так, потому что в итоге мне придется изменить размер массива. Я успешно выполнил следующее с 1D-массивом:

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

Я хотел бы сделать следующее с 2D-массивом, но он не будет компилироваться:

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

Компилятор дает мне сообщение о том, что "someidth не может появляться в константном выражении. Я пробовал всевозможные комбинации ** и [] [], но никто из них, похоже, не работает. Я знаю, что это не так сложно... Любая помощь приветствуется.

4b9b3361

Ответ 1

Я только нашел, что этот древний ответ по-прежнему читается, что является позором, поскольку это неправильно. Посмотрите ниже ответ со всеми голосами.


Прочитайте синтаксис указателя, вам нужен массив массивов. Это то же самое, что указатель на указатель.

int width = 5;
int height = 5;
int** arr = new int*[width];
for(int i = 0; i < width; ++i)
   arr[i] = new int[height];

Ответ 2

const int someheight = 3;
 const int somewidth = 5;

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

Ответ 3

Готовый к использованию пример из здесь, после нескольких секунд поиска в Google с фразой "двумерный динамический массив":

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;

Ответ 4

Я предлагаю использовать гораздо более простой метод, чем массив массивов:

#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)];

Ответ 5

Лично я предпочитаю использовать синтаксический трюк, чтобы объявить указатель на многомерный массив динамически большого размера. Это работает в компиляторах, которые поддерживают Variable Length Arrays (VLAs), которые должны быть все компиляторы С++, и большинство современных компиляторов 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" выглядит немного странно, но позволяет вам напрямую и просто использовать требуемый синтаксис многомерных массивов

Ответ 6

Я думаю, что это будет делать

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