Объявление указателя на многомерный массив и выделение массива - PullRequest
22 голосов
/ 11 октября 2010

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

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

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

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

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

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

Ответы [ 6 ]

43 голосов
/ 11 октября 2010
const int someheight = 3;
 const int somewidth = 5;

 int (*array)[somewidth] = new int[someheight][somewidth];
13 голосов
/ 11 октября 2010

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


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

int width = 5;
int height = 5;
int** arr = new int*[width];
for(int i = 0; i < width; ++i)
   arr[i] = new int[height];
6 голосов
/ 11 октября 2010

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

#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)];
6 голосов
/ 11 октября 2010

Готовый пример из здесь , после нескольких секунд поиска в 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;
2 голосов
/ 01 сентября 2016

Лично я предпочитаю использовать синтаксический трюк для объявления указателя на динамический размерный многомерный массив.Это работает в компиляторах, которые поддерживают массивы переменной длины (VLA), что должны делать все компиляторы C ++, и в большинстве современных компиляторов C.

Основная идея описана в этом:"указывает на (непрерывный) блок пространства, который вы хотите рассматривать как многомерный массив.«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" выглядит немного странно, но позволяет вам напрямую и просто использоватьжелаемый синтаксис многомерного массива

1 голос
/ 04 октября 2014

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

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] ; 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...