Найти тему
D21nk Master

Погружаемся в матрицу

В прошлой статье мы начали знакомиться с двумерными массивами,сегодня окончательно с этим разберёмся,а так же узнаем,как работать с двумерными строками.
Как вы помните,двумерный массив создаётся так:

int arrat[2][2];

Где они нужна,и как её можно практически применить? Когда мы с вами познакомимся с цветным выводом консоли-можно в матрице сохранять ваши пиксельные изображения по следующему наброску:

Создать массив кодировок цвета
Принять матрицу
Пока матрица не закончится
Если элемент матрицы равен элементу цвета
Вывести этот цвет

Так же часто на уроках в ютубе я встречал,как люди перемножают матрицы.То есть берут одну матрицу и перемножают каждый её элемент на элемент другой матрицы-ни разу это не пригодилось,хотя я понимаю как это можно применить.Допустим в шифровании.
Куда более интересна тема двумерных строковых массивов.Мы с вами умеем хранить и работать со строками,но что если необходимо хранить и обрабатывать сразу несколько строк? Чтобы погрузиться в эту тему предлагаю вам разобрать следующий код:

void main()
{
//массивы можно создавать и так
int arr[4]={1,2,3,4};
for(int i=0;i<4;++i)
printf("%d\n",*(arr+i));//Это законно?!
}

Соберите программу и запустите.
Я бы назвал это "прогулка по памяти".Что тут происходит? Мы разыменовываем указатель массива,к которому прибавляется переменная.Переменная перемещает указатель к следующей ячейке памяти.Ух,думаю это было не просто.Поэтому обратимся к вашим любимым аналогиям:
Представьте себе поезд,станции,на которых он останавливается-наши участи памяти,переменная-перемещает поезд,разыменовывание-сообщение от борт-проводника об названии станции.
В данном цикле поезд начинает своё путь с первой станции,которую борт-проводник оглашает,после мы перемещаемся к следующей станции т.д.
Вообще на самом деле вы постоянно использовали именно такое обращение,просто запись arr[i] более короткая.Некоторые индивидуумы правда считают что пример выше работает быстрее короткой записи-это не так.Компилятор всё равно их замещает на *(arr+i).
Теперь взглянем как можно это всё применить к строкам:

void main()
{
//две строки по 10 символов
char names[2][10]={"Vasya","Petya"};
for(int i=0;names[i];++i)
printf("%s\n",names[i]);
}

В данном примере мы обращаемся к первому элементу каждого массива,как мы помним-данный элемент указывает на всю строку,пока она не закончится.
На этом мы пока остановимся.Домашнее задание: написать программу с двумерным массивом строк,который нужно заполнить через scanf.Желаю успехов!