2012-04-01 4 views
0

Я работаю над проектом, в котором я должен хранить постоянные многомерные массивы. Я хотел бы сделать это с помощью указателя, который указывает на многомерные массивы. Однако я не удалось. Я написал этот код, но он не был скомпилирован.C++: сохранение постоянных многомерных массивов в указателе

int darray[1][2]; 
    int darray2[2][3]; 
    int (*p)[1][2]; 
    p= new int[2]; 
    p[0] = darray; 
    p[1] = darray2; 
+0

Я бы рекомендовал сделать 'struct' для постоянных многомерных массивов, а затем сделать указатель на эту' struct' – twain249

+0

Непонятно, что вы хотите, чтобы этот код выполнял. Вы хотите, чтобы 'p' указывал на' darray'? Какова цель 'darray2'? –

+0

жаль, что это был darray2, который хранится в p [1] – berkay

ответ

2

Ну, давайте идти через код построчно (ОК, я глыбы первые две строки вместе)

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) путем копирования только части данных вручную.

+0

большое спасибо, это решило мою проблему – berkay

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