Многомерный массив и указатели в C ++? - PullRequest
0 голосов
/ 30 июля 2010
int *x = new int[5]();

С учетом вышеизложенного, как должен быть написан код для двумерного массива - int[][]?

int **x = new int[5][5] () //cannot convert from 'int (*)[5]' to 'int **'

В первом утверждении я могу использовать:

x[0]= 1;

Но второе сложнее, и я не мог понять это.Должен ли я использовать что-то вроде:

x[0][1] = 1;

Или рассчитать реальную позицию, а затем получить значение для четвертой строки и столбца 1

x[4*5+1] = 1;

Ответы [ 6 ]

4 голосов
/ 30 июля 2010

Я предпочитаю делать это так:

int *i = new int[5*5];

и затем я просто индексирую массив по 5 * row + col.

2 голосов
/ 30 июля 2010

В C ++ нет оператора new[][]. Сначала вам нужно будет выделить массив указателей на int:

int **x = new int*[5];

Затем выполните итерацию по этому массиву. Для каждого элемента выделите массив целых:

for (std::size_t i = 0; i < 5; ++i)
    x[i] = new int[5];

Конечно, это означает, что вам придется делать обратное при освобождении: delete[] каждый элемент, затем delete[] больший массив в целом.

2 голосов
/ 30 июля 2010

Вы можете выполнить инициализацию отдельно:

int **x = new int*[5];
for(unsigned int i = 0; i < 5; i++)
    x[i] = new int[5];
1 голос
/ 03 июня 2011

Вот как вы это делаете:

int (*x)[5] = new int[7][5] ;

Я сделал два измерения разными, чтобы вы могли видеть, какое из них вы должны использовать на lhs.

0 голосов
/ 21 марта 2012

Есть несколько способов сделать это:

  • Использование поддержки gcc для плоских многомерных массивов (ответ TonyK, наиболее актуальный для вопроса IMO).Обратите внимание, что вы должны сохранять границы в типе массива везде, где вы его используете (например, все размеры массива, за исключением, возможно, первого), и это включает функции, которые вы вызываете, потому что созданный код будет принимать один массив.Выделение $ new int [7] [5] $ приводит к тому, что в памяти выделяется один массив.индексируется компилятором (вы можете легко написать небольшую программу и напечатать адреса слотов, чтобы убедить себя).

  • Использование массивов указателей на массивы.Проблема с этим подходом заключается в том, что необходимо распределить все внутренние массивы вручную (в циклах).

  • Некоторые люди предложат использовать std :: vector из std :: vectors, но это неэффективно, из-за выделения памяти и копирования, которое должно происходить при изменении размера векторов.

  • У Boost более эффективная версия векторов в своей библиотеке multi_array.

В любом случае, на этот вопрос лучше ответить здесь: Как использовать массивы в C ++?

0 голосов
/ 30 июля 2010

Если массив имеет предопределенный размер, который вы можете написать просто:

int x[5][5];

Он компилируется

Если нет, то почему бы не использовать вектор?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...