2016-03-18 4 views
-1

Я хочу, чтобы присвоить массив в указатель, так что я могу использовать егоКак назначить двумерный массив указателю?

int arrayA[2][2] = {{1,2},{3,4}}; 
int arrayB[3][1] = {{1},{2},{3}}; 
int** arrayC; 
if(case1) 
    arrayC = arrayA; 
if(case2) 
    arrayC = arrayB; 
//work with arrayC 

Что я мог сделать?

Редактировать: Нашли другое решение. См. Ответы

+4

Какова ваша текущая проблема? Чего вы хотите достичь? – user463035818

+2

два массива имеют совершенно разные размеры. Как бы вы «работали с arrayC», если в нем всего 4 или 3 элемента? – user463035818

+0

Я бы сохранил размеры в другой переменной – rkgghz

ответ

0

Я нашел решение с динамической инициализации массива:

int arrayA[2][2] = { { 1, 2 }, { 3, 4 } }; 
int arrayB[3][1] = { { 1 }, { 2 }, { 3 } }; 
int** arrayC; 
int dimension1, dimension2; 
if (case1) 
{ 
    dimension1=2; 
    dimension2=2; 
    arrayC = new int*[dimension1]; 
    for (int i = 0; i < dimension1; i++) 
     arrayC[i] = arrayA[i]; 
} 
if (case2) 
{ 
    dimension1=3; 
    dimension2=1;  
    arrayC = new int*[dimension1]; 
    for (int i = 0; i < dimension1; i++) 
     arrayC[i] = arrayB[i]; 
} 
//work with arrayC 
for (int i=0; i<dimension1; i++) 
    arrayC=null; 
delete[] arrayC; 
2

int ** - принципиально другой и, следовательно, несовместимый тип данных, чем 2D-массив int [][].

Единственный простой способ сделать вид, что вы пытаетесь в вашем примере выше, чтобы сгладить ваши 2D массивы 1D массивов:

int arrayA[2 * 2] = { 1, 2, 3, 4 }; 
int arrayB[3 * 1] = { 1, 2, 3 }; 
int* arrayC; 
if (case1) 
    arrayC = arrayA; 
if (case2) 
    arrayC = arrayB; 

Очевидно, то вам нужно сделать явный массив расчетов индексов сам.

1

Вы не можете назначить (правильный термин - преобразовать) 2D-массив в указатель на указатель. Причина в том, что преобразование 1D-массива в указатель (в первый элемент) не применимо в более высоких измерениях.

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

int arrayA[2][2] = {{1,2},{3,4}}; 
int (*arrayB)[2]; 
arrayB = arrayA; 

Дело реализовать, однако, заключается в том, что *arrayB является адрес первого элемента arrayA. В этом примере этот элемент представляет собой массив, инициализированный с использованием {1,2}.

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

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

Если вы хотите несовпадения размеров, нет другого решения, кроме выравнивания массива до одного измерения.

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