Одна из базовых структур в программировании - «Массив данных» / Array. Массивы используются практически везде, на любых платформах, в любых устройствах и в любых средах разработки. Сложно представить современный компьютерный мир без массивов, настолько повсеместно и широко они распространены. Это такая же универсальная и нужная в программировании вещь, как например сумка или чемодан в бытовом применении.
Массив данных нужен для упорядоченного хранения однотипной информации. Он представляет из себя последовательный набор ячеек для хранения чего-либо. Например - чисел, строк, символов, или других типизованных объектов. Важной отличительной особенностью массива (в общем смысле) является именно однотипность содержимого. То есть, при "создании" массива, в большинстве случаев требуется явно указать, что именно будет храниться внутри него.
Визуализация массива на примере яблок, как на картинке выше. Здесь можно наблюдать пять массивов яблок, каждый из которых имеет длину 8 ячеек. Яблоки можно брать или класть, в общем смысле не нарушая их последовательность. Если яблоко было взято из некоторой "ячейки", то ячейка становится пустой, и туда можно положить какое-то другое яблоко.
Ещё один пример визуализации массива. Представь себе пять небольших пустых чашек, стоящих в ряд. У каждой чашки есть свой номер. Каждая чашка имеет ограниченный размер. В каждую чашку можно положить орех, и потом достать его. Если мы положили орех в чашку номер 3, то она пока занята, и мы это видим. Если мы возьмём орех обратно, то чашка номер 3 снова станет пуста. В одну чашку нельзя положить больше одного ореха. Точно так же, из чашки можно забрать орех только в том случае, если он там уже лежит. Чашки нельзя перемещать друг относительно друга, и в целом они ведут себя достаточно предсказуемым образом - стоят в ряд, и каждая из них может или содержать орех, или быть пустой.
Как устроен массив данных ⚙️
Линейный типизованный массив должен соответствовать двум важным условиям. Это - однотипность данных, и последовательность данных. Иными словами, массив чисел должен содержать только числа. Массив строк должен содержать только строки. Массив длиной 5 ячеек имеет 5 последовательных ячеек, одну за другой.
Элементы массива должны располагаться "один за другим". То есть, ячейки массива должны иметь "номера", и у программиста должна быть возможность обращения к этим ячейкам по их номерам.
В одну и ту же ячейку нельзя положить сразу несколько чисел. В каждую ячейку в один момент времени помещается только одно, конкретное число. С другой же стороны, мы можем "забрать" число из некоторой ячейки. И тогда, ячейка станет пустой, и доступной для "записи".
Обратите внимание! Номера ячеек внутри массива всегда начинаются с "нуля". То есть, самая первая ячейка массива всегда будет иметь номер "ноль", а не номер "один", как это может показаться с точки зрения привычного мироустройства.
В большинстве языков и сред программирования, для адресации "ячейки" массива используют квадратные скобки. Например, для записи значения в ячейку 40 в массиве с названием MyArray, используется вот такая конструкция:
MyArray[40] = 123123;
Точно такой же синтаксис используется для получения значений из некоторой ячейки.
int arrayValue = MyArray[40];
Для определения длины массива используется команда (свойство) length. Оно возвращает числовую длину массива. В зависимости от языка и среды выполнения, команда length может иметь немного отличный синтаксис. Например, для C# это будет выглядеть вот так:
MyArray.length
Для языка PHP эта же самая команда пишется как count. Вот так:
count(MyArray)
В других языках, название или синтаксис применения этой команды могут так же отличаться. Но в общем и целом, стоит ориентироваться на различные виды команд length или count.
Почему массивы важны и нужны? ☝️
Ответ достаточно прост и очевиден - потому что это самый логичный и интуитивно понятный способ хранения информации. В общем и целом, любые приложения предназначены для решения каких-то конкретных задач. И так уж получилось, что людям привычно сегментировать задачи вокруг каких-то данных одного типа. Например в мессенджере в основном фигурируют текстовые данные, а в соцсетях вроде ТикТока - видеоданные.
Согласись, гораздо удобнее хранить однотипные данные последовательно - "в рядок", чем делать то же самое в беспорядочном или каком-то другом запутанном виде. Именно для организации удобного и предсказуемого хранения данных нужны массивы. Как правило они максимально линейны, понятны и эффективны в своей простоте.
Открывая канал с новостями, или чат в Телеграмме, мы видим список сообщений. В таком случае - сообщения представляют собой массив текстовых записей. Открывая ТикТок, мы видим список видео - то есть массив видеозаписей.
Если мы погрузимся на следующий уровень системы, то увидим что каждое текстовое сообщение - это строка, которая на самом деле представляет из себя массив отдельных символов. А если посмотрим на отдельно взятое видео - то увидим "под капотом" массив типа byte.
В конечном итоге, практически все комплексные типы данных сводятся к массивам типа byte, которые "обёрнуты" в вышестоящие классы, для упрощения доступа.
Статические и динамические массивы 📦
Помимо типов данных, условно говоря, массивы делятся на статические и динамические. Их главное отличие заключается в том, может ли массив менять свой размер в ходе выполнения программы.
Статические массивы, как в примере с чашками, не могут изменять свой размер. Это значит, что количество элементов фиксируется на момент объявления массива внутри программы. Массив не обязательно должен содержать какие-то элементы на начальном этапе. Но в момент своего объявления программист должен принципиально решить - будет ли массив фиксированного размера, или нет.
С точки зрения прикладного программирования, динамические массивы имеют большую популярность. Они позволяет добавлять или убавлять элементы на любом этапе работы с программой. Тем не менее, если заглянуть "под капот" динамического массива, то часто мы увидим там набор статических массивов, которые ловко контролируются специальным программным кодом.
Как создать массив? 👨💻
В зависимости от языка программирования, синтаксис для создания массива будет несколько отличаться. Но это не является какой-то проблемой, поскольку с технической точки зрения, в конечном итоге, массив будет работать одинаковым и достаточно предсказуемым образом в любой среде программирования.
Работа с массивами в языке C#
Документация на learn.microsoft - подробная статья по массивам в C#. И так же, простой пример создания и записи данных в массив на C#:
// Создаём массив чисел длиной 5 ячеек:
int[] numbers_array= new int[5];
//Записываем в ячейку номер 2 цифру 94
numbers_array[1] = 94;
// Создаём массив строк длиной 5 ячеек:
string[] stringArray = new string[6];
//Записываем в ячейку 5 строку "Привет"
stringArray[4] = "Привет!";
В языке C# и платформе .NET есть не только статические, но и динамические массивы. В случае с динамическими массивами, их размер может быть неизвестен на момент инициализации. Вот статья с техническими подробностями и документацией по динамическим массивам List<T>.
Работа с массивами в языке PHP
Документация на php.net - подробная статья по массивам в PHP.
Язык PHP менее строг в вопросах работы с массивами. Здесь можно создавать массив без явного указания типа данных. В процессе добавления элементов, среда выполнения программы самостоятельно позаботится о правильном хранении значений внутри ячеек.
//Пример создания массива строк
$array = array("foo", "bar", "hallo", "world");
//Пример создания массива чисел:
$numbers = Array(1,2,3,4,5);
//Пример замены числа 3 на число 88 в массиве чисел
$numbers[2] = 88;
Работа с массивами в языке JavaScript
JavaScript - самый неприхотливый язык в плане синтаксиса и типизации. "Делай что хочешь, и тебе за это ничего не будет" - примерно так можно описать подход к типизации и контролю кода со стороны среды выполнения. Но тем не менее, JS используется в большей части существующих сайтов. Так что, всё хорошо! 😄
Подробная статья по массивам в JS с сайта learn.javascript. Так же, примеры работы с массивами в JS:
//Создаём массивы, два способа:
let arr = new Array(2);
let arr2 = [];
//Записываем значения в массив
arr[0] = 10; arr[1] = 20;
arr2.push("asdasd"); arr2.push("HEHEHE");
//Создаём еще один массив сразу со строками внутри
let fruits = ["Яблоко", "Апельсин", "Слива"];
Немного философии про массивы 👨🦳
Есть интересная точка зрения о том, что во вселенной принципиально боятся две силы - сила хаоса и сила порядка. При этом, сила хаоса стремится разрушить мир и вернуть его к началу начал. А сила порядка - организовать мир простым и удобным способом. Постоянное противодействие этих сил представляет из себя баланс, великую гармонию и хрупкую точку равновесия, Инь и Янь.
С этой точки зрения, массивы данных являются классическим инструментом силы упорядочивания. И в волшебном мире программирования они используется буквально везде. Даже эта статья состоит из массивов данных, которые аккуратно хранятся в массивах ячеек внутри памяти одного из серверов.
Освоение и умелая работа с массивами является важнейшим навыком любого программиста. Поэтому, настоятельно рекомендую уделить этому вопросу должное внимание.
🔥 Понравилось? Подпишись! Победим восстание роботов вместе! 🔥
🚀 P.S. Ты можешь круто поддержать меня и проект "Войти в IT" на boosty! Я публикую там более эксклюзивный и профессиональный, иногда немного личный контент. Хочешь посмотреть как я выгляжу в реальной жизни? Тогда жми: Ссылка 🚀
P.S.2 У меня ещё есть Telegram-канал. Там посты чуть попроще, и чуть повеселей. Ссылка