Ну, давайте идти через код построчно (ОК, я глыбы первые две строки вместе)
int darray[1][2];
int darray2[2][3];
ОК, это определяет две двумерные массивы в точности так, как вы (вероятно) ожидаете. Обратите внимание, что формально это фактически массивы массивов ints. Более точно, darray
имеет типа «массив 1 массив 2 целых чисел каждого», и darray2 имеет типа «массив из 2 массивов 3 Интса каждый»
int (*p)[1][2];
Это определяет указатель на двумерный массив от int или к первому элементу массива таких массивов. То есть тип p
является «указателем на массив из 1 массива по 2 целых числа».
p= new int[2];
Здесь выделяют место для двух целых чисел (т.е. один одномерный массив целых чисел, длины два), и new
возвращает указатель на первый элемент из этого массива, то есть указатель на Int , Вы пытаетесь присвоить этому указателю int значение p
, которое является указателем на массив из 1 массива из 2 ints, как указано выше. Это дает несоответствие типа и не должно компилироваться.
Это не совсем понятно, что вы хотите в этой точке, но, учитывая, что вы делаете поручения p[0]
и p[1]
после этого, и учитывая, что возвращаемое значение присваивается p
, который имеет тип int (*)[1][2]
очевидный выбор будет p = new int[2][1][2];
p[0] = darray;
Это опять не работает, потому что массивы в C++ не являются первоклассными объектами. То есть, вместо того, присваивая значение darray
к p[0]
, как линия будет предложить (и p[0]
действительно будет иметь правильный тип для этого) правила C++ говорят, что массив darray
является способствовало к указатель на его первый элемент. То есть, этот код на самом деле пытается сделать, это назначить указатель на первый элемент darray
(типа int (*)[2]
) на p[0]
(типа int[1][2]
), который, конечно же, не удался. В C++ массивы просто не назначаются.
p[1] = darray2;
Это страдает от тех же проблем, однако отметить, что даже если массивы были первым классом, назначаемые объекты в C++, это все еще будет несоответствие типов, поскольку p[1]
имеет типа int[1][2]
в то время как darray2
имеет типа int[2][3]
.
Обратите внимание, что вы получите вокруг большинство из этих ограничений (кроме последнего), просто обернув вам массив в классе C++ 11 на самом деле представляет собой стандартный шаблон класса под названием std::array
для этой цели):
struct array12 { int data[1][2]; };
array12 darray;
array12* p;
p = new array12[2];
p[0] = darray;
С небольшим количеством программ вы также можете обрабатывать назначение от больших до меньших массивов (ваш случай darray2
) путем копирования только части данных вручную.
Я бы рекомендовал сделать 'struct' для постоянных многомерных массивов, а затем сделать указатель на эту' struct' – twain249
Непонятно, что вы хотите, чтобы этот код выполнял. Вы хотите, чтобы 'p' указывал на' darray'? Какова цель 'darray2'? –
жаль, что это был darray2, который хранится в p [1] – berkay