2011-05-30 4 views
1

Уместно ли вызывать динамический многорядный массив, массив массивов?Динамические многомерные массивы

int **mp = 0; 

// Create an array of pointers 
mp = new int*[6]; 

// Where each element of type pointer, points to dynamic array. 
for (int x = 0; x < 6; x++) 
    mp[x] = new int[7]; 

Глядя на это, я бы сказал, что они представляют собой массив указателей, указывающих на массивы размера 7 ints. Но являются ли динамические массивы даже рассмотренными массивами или просто патроном памяти, возвращаемым указателем?

+0

uhh, который должен быть 'x <6' не' x <7'. 'mp [6]' неверно. – asveikau

+0

Что означают «массивы памяти»? 'memory' не является сущностью или объектом. – Nawaz

+0

Даже тогда 'массивы динамической памяти' не имели бы смысла. 'массивы int' имеют смысл,' массивы char * 'имеют смысл,' массивы std :: vector 'имеет смысл. Но 'массивы памяти' не имеют смысла, если вы не определяете пользовательский тип, называемый' memory'. – Nawaz

ответ

2

Если я правильно понял, ваш вопрос касается семантики. Что касается стандарта, то new [] создает массив, но возвращает указатель на первый элемент. Из 5.3.4/5 стандарта:

Когда выделенный объект является массивом ... новое выражение дает указатель на начальный элемент (если какой-либо ) массива.

Так что в вашем случае то, что мы разговорно называем «массивом массивов», действительно представляет собой массив указателей, который отличается от, например, int x[6][6], который поистине представляет собой массив массивов.

+0

Действительно ли указатель на разложение массива преобразование продолжается, когда массив создается? – user746411

+0

@user: Это зависит от того, что вы подразумеваете под «действительно»! Под капотом часть выделения памяти из 'new', вероятно, всего лишь оболочка для' malloc() '. Но семантически, стандарт думает об этом как о создании массива. Таким образом, в этом смысле, да, я думаю, это можно было бы рассматривать как распад от матрицы к указателю. –

0

C++ (и C) обрабатывают рваные массивы и смежные многомерные массивы совершенно по-разному. Доступ к элементу кажется таким же, но совсем другой под капотом.

void do_something (
    double matrix[3][3], 
    double ** ragged_array) 
{ 
    double x = matrix[1][2]; 
    double y = ragged_array[1][2]; 
    ... 
} 

Первый доступ требует прохождения указателя только один раз, в то время как второй требует прохождения двух указателей.

+0

Это на 100% верно, но я не уверен, что он решает вопрос. –

0

Я думаю о массивах в качестве указателей, потому что на практике переменная, содержащая массив, является указателем на первый элемент массива. Кроме того, вы можете использовать оператор [] в любом указателе, даже если он не указывает на массив. С этой линией мысли:

ммк является указателем на «кусок целых указателей», и тра [х] является указателем на «кусок целых чисел».

Теперь эти «куски памяти» является то, что я думаю, как массив, так что у вас есть:

тр представляет собой указатель на массив целых указателей, и тра [х ] - указатель на массив целых чисел.

В вашем примере у вас есть в общей сложности 7 массивов (куски памяти), по одному на каждые новый заявление. Не забудьте до удалить [] каждый из них после того, как вы закончите использовать эту структуру.

+0

Обязательный -1 для «переменной, которая содержит массив, является указателем на первый элемент». –

+0

Если бы я был пуристом, я бы согласился с тобой. Однако тот факт, что вы не можете получить (по крайней мере, не знаю) из такой переменной информацию о том, содержит ли он массив или нет, вы могли бы на практике считать его указателем. – Kanopus

+0

Существует несколько способов, в которых массивы и указатели не совпадают. например используя 'sizeof', присваивание, переходя к функциям, арифметику указателя, тот факт, что' T [] [] 'не может быть преобразован в' T ** 'и т. д. –

2

Да, это массивы указателей. Массивы массивов различны:

// array of 6 pointers into one-dimensional arrays 7 elements each 
int** mp = new int*[6]; 
for (int x = 0; x < 6; x++) 
    mp[x] = new int[7]; 

// array of 6 arrays of 7 elements each (two-dimensional 6x6 array) 
// (all dimensions except the 1st must be known at compile time) 
int (*mp)[7] = new int[6][7]; 
// or, more commonly, when all dimensions are known at compile time, 
int mp[6][7]; 

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

+0

+1 для приятного примера того, как динамически получать истинный массив массивов (ну, как бы то ни было указатель на его первый элемент). –

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