Динамические многомерные массивы - PullRequest
1 голос
/ 30 мая 2011

Целесообразно ли называть динамический многомерный массив массивом массивов?

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 дюймов. Но являются ли динамические массивы даже массивами или просто фрагментом памяти, возвращаемым указателем?

Ответы [ 4 ]

2 голосов
/ 30 мая 2011

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

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

2 голосов
/ 30 мая 2011

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

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

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

0 голосов
/ 30 мая 2011

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

mp - указатель на «блок целочисленных указателей», а mp [x] - указатель на «блок целых чисел».

Теперь, эти «куски памяти» - это то, что я бы назвал массивом, так что у вас есть:

mp - указатель на массив целочисленных указателей, а mp [x] - указатель на массив целых чисел.

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

0 голосов
/ 30 мая 2011

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

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

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

...