2011-07-08 2 views
2

все. У меня есть интересный вопрос, заданный мне моим профессором C++. По-видимому, он также используется в некоторых интервью с заданиями на программирование.C++: сделать одну точку матрицы другой

Прошлая ситуация. У меня есть двумерный массив (матрицу) ИНТ-х:

int array1[][2] = {{11, 12}, {21, 22}}; 

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

Очевидным решением является использование указателей. Итак, я объявил array2 следующим образом:

int (*array2)[2][2]; 
array2 = &array1; 

Это, кажется, работает. Теперь, вот улов. Я пытаюсь вычесть 11 из array1, но делаю это, ссылаясь на массив2. Вот код для того, что я пытаюсь выполнить:

for (int i = 0; i < 2; i++) { 
    for (int j = 0; j < 2; j++) { 
     // Trying to do the equivalent of this: 
     array1[i][j] -= 11; 
    } 
} 

Я попытался следующие в теле внутренней для цикла, все без успеха:

// Second row not affected 
*(array2[i][j]) -= 11; 

// Second row not affected 
*(*(array2[i]) + j) -= 11; 

// incompatible types in assignment of `int' to `int[2]' 
*(*(array2 + i) + j) -= 11; 

Любые идеи? Я подозреваю, что есть что-то простое, что я просто не добираюсь сюда.

Спасибо!

ответ

1

Поскольку это C++, вы можете создать массив псевдонимов с использованием ссылки, это именно то, что они делают.

int array1[][2] = {{11, 12}, {21, 22}}; 
int (&array2)[2][2] = array1; 

for(int i=0; i<2; ++i) 
    for(int j=0; j<2; ++j) 
     array2[i][j] -= 11; 

Хотя проблема, скорее всего, проблема C с ожиданием, что array2 будет указателем на первый ряд array1

int array1[][2] = {{11, 12}, {21, 22}}; 
int (*array2)[2] = array1; 

for(int i=0; i<2; ++i) 
    for(int j=0; j<2; ++j) 
     array2[i][j] -= 11; 
+0

Проблема со вторым решением заключается в том, что я не могу передать массив2 функции вместо array1. Кроме того, я еще не видел первый синтаксис, используемый при объявлении массива; Я даже не знал, что смогу это сделать. –

+0

@Karl, проходящий к функции, идентичен: 'f (int a [] [2], int size)' будет принимать 'array1' и любую версию' array2' – Cubbi

+0

Извините, вы правы. То, как я его первоначально настраивал, вы должны разыменовать массив, когда вы его передаете: f (* array2, 2). Если вы используете какое-либо из ваших решений, вы этого не сделаете. Вот где я получал ошибки. –

5

array2 указывает на array1, так что вы можете добраться до array1 с помощью *array2. Попробуйте (*array2)[i][j].

+0

О, Дух, конечно, что будет работать. Я думал, что мне нужно было разыменовать указатель на строки массива, а не указатель на сам массив. Благодаря! –

+1

@Karl: если это правильный ответ, не забудьте принять его тем же серым знаком слева от ответа. –

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