2016-09-08 10 views
1

Я запутался в этой строке в программе на C++. Идея программы - проверить, симметричен ли массив 4x4 или нет. Эта часть кода объявляет 2D-массив, который я не понимаю.Объявление двумерного массива с использованием двойного указателя

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

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

int *array = new int[n]; 

Я не понимаю двойную стрелку. Пожалуйста, объясните.

+0

Подумайте об этом так: Первый из них - выделение последовательности указателей 'n', каждому из которых может быть присвоено нечто похожее на вторую строку, что вы уже понимаете. Затем вы получаете доступ к i'th «строке» данных через 'array [i]'. Но это просто «int *». Поэтому вы можете получить доступ к * своему * j'th "столбцу" данных через 'array [i] [j]'. – WhozCraig

ответ

3

Как создать единый массив указателей? Вы делаете это:

int* myArray = new int[n]; 

Что это значит? Он состоит из двух частей. Первая часть резервирует указатель int*, мы называем это myArray, а во второй части вы резервируете n элементов, каждый из которых имеет размер int в памяти (это массив, справа?), И вы берете адрес этого массива и сохраняете он в переменной myArray.

Теперь вам нужен 2D-массив, который является массивом массива. Итак, каждый элемент этого нового массива массива является одним из них, о котором мы говорили там. Как мы это резервируем? Мы делаем:

new int*[n]; 

Поскольку мы резервируем n слотов, каждый из которых с типом int*, о которых мы говорили раньше.

Теперь, каков тип возвращаемого значения? Это массив из массива, или «указатель на массив, а второй также указатель на массив», так что вы пишете, как

(int*)* 

Или

int** 

поэтому становится

int** array = new int*[n]; 
+0

«... 2D-массив, который является массивом массива» - это утверждение является точным. Но путаница OP не должна поощряться путанием массива * массивов * с массивом * указателей *. Они ** не ** синонимы. Последний предлагает синтаксический сахар, чтобы он выглядел как первый, но они никоим образом не совпадают. Я надеюсь, что OP схватит это, или они вернутся к другому вопросу о том, почему передача 'a', объявленная как' int a [n] [m]; 'функции, ожидающей' int ** ar', не работает. – WhozCraig

+0

@WhozCraig Мне нравится делать вещи систематически понятными. Вот что я пытался сделать там. –

+0

@TheQuantumPhysicist Ваше объяснение было действительно полезно. Огромное спасибо. – TheLearner

1

int** array является указателем на указатель на int. Так, делая это:

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

вы создаете раздел памяти, который содержит nint* указатели и указывая array в этой памяти. Для каждого из этих указателей, которые вы создали, можно создать набор int с примерно так:

for (auto i = 0; i < n; ++i) 
    array[i] = new int[n]; 

Полученная память будет выглядеть следующим образом:

array -> [  int*  |  int *  | .... n 
     [int | int | ...][int | int | ...][ ... n 

Это, однако, гораздо гораздо проще, если вы используете некоторые из std вещей в C++, т.е. std::vector:

std::vector<std::vector<int>> arr(std::vector<int>(0, n), n); 

и вы сделали ...

+0

Очень хорошо объяснено. Спасибо за помощь. – TheLearner

Смежные вопросы