Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

как правильно прочесть и посчитать строчку? x = **mat + *(mat[1] + 2) + *(mat[1] + 4);

Nikita Pavlov Ученик (76), закрыт 11 месяцев назад
int mat[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int x = 0;
x = **mat + *(mat[1] + 2) + *(mat[1] + 4);
printf("%d", x);
Лучший ответ
Андрей Высший разум (435206) 7 лет назад
**mat - это mat[0][0] == 1
*(mat[1] + 2) - это mat[(1*3+2)/3][(1*3+2)%3] => mat[1][2] == 6
*(mat[1] + 4) - это mat[(1*3+4)/3][(1*3+4)%3] => mat[2][1] == 8

1 + 6 + 8 == 15
Nikita PavlovУченик (76) 7 лет назад
но работает же код, встав те в компилятор GCC и посмотрите, ответ 15, а вопрос как он к этому пришел?
Андрей Высший разум (435206) Дописал в основном ответе
Nikita PavlovУченик (76) 7 лет назад
понял, большое спасибо!
Остальные ответы
... Гений (84865) 7 лет назад
*mat - указатель на 0 элемент в матрице, соотв **mat = 1
(mat[1] + 2) - указатель на элемент в 1ой строке + 2 смещение, соотв. *(mat[1] + 2) = 6

*(mat[1] + 4) Тут в принципе выход за пределы границы 1ой строки, с попаданием на следующую. Но надо ли Вам это и специально ли сделано - вопрос к Вам. А так *(mat[1] + 4) = 8
Nikita PavlovУченик (76) 7 лет назад
а как же тогда компилятор посчитал что 15?
... Гений (84865) Добавил пояснения.
Nikita PavlovУченик (76) 7 лет назад
да так написано
Похожие вопросы