Найти тему
ZDG

Языки программирования: Строки, часть 2. И массивы.

В предыдущем выпуске я рассказал, почему для строки нужен особый способ хранения в памяти, и как языки программирования выкручиваются из этой ситуации.

Языки программирования: Строки, часть 1.
ZDG22 июня 2020

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

Хочу лишь указать на одну неочевидную, может быть, вещь. Строки для нас это вроде как тексты, которые можно прочитать. Например, "Hello world". Однако для компьютера строка это последовательность любых байтов, абсолютно любых. И это многое меняет.

Например, изображение в формате JPEG, загруженное в память компьютера – это строка. Это же последовательность байтов, правильно? Значит, это строка. Звуковой файл MP3, загруженный в память – тоже строка. ZIP-архив, загруженный в память – тоже строка.

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

В то же время есть еще одна сущность, которую мы до сих пор не рассматривали – массив. Массив это тоже последовательность. Он очень похож на строку. Но только строка состоит из символов, а массив может состоять из чего угодно. Из символов, из целых чисел, из дробных чисел, из строк, из массивов.

Если быть совсем точным, то строка – это массив, который состоит из байтов. В большинстве случаев между строкой и байтовым массивом нет вообще никакой разницы.

С точки зрения памяти строку и массив можно оформить идентично:

s = "Hello World";
m = ['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'd'];

Обе эти записи дадут один и тот же результат:

При создании строки s в памяти появится цепочка из байтов "H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'd'.

При создании массива m в памяти появится точно такая же цепочка байтов.

Почему тогда инструкции для строки и массива пишутся настолько по-разному? Для массива они выглядят очень сложно.

Ну во-первых, ничего сложного, это всего лишь перечисление через запятую символов, записанных в кавычках или апострофах (в зависимости от языка).

Во-вторых, элементы массива могут быть гораздо мудрёнее, чем символы строки.

Если бы в массиве хранились только коды букв 'H', 'e', 'l', 'l', 'o' и так далее, мы вполне могли бы записать их в виде цельной строки, потому что и так понятно: один символ это один байт.

Но если в массиве нужно хранить элементы другого типа, например, большие числа 48969487, 5809141, 1232341, 543680, то в виде строки их записать уже нельзя (можно, но только если вручную перевести всё это в байты и затем в символы).

А записать просто перечислением через запятую уже гораздо проще. Вот:

m = [48969487, 5809141, 1232341, 543680];

Кроме того, массивы умеют делать то, что строки точно не умеют – хранить в себе другие строки. В этом примере в массиве хранятся 2 строки, "Hello" и "world":

m = ["Hello", "world"];

А кроме того, в массивы можно записывать другие переменные. В этом примере в массиве m сохранены значения переменных a и b, в массиве m2 три раза хранится адрес массива m, и так можно продолжать сколько угодно:

a = 5;
b = "Hello world";
m = [a, b];
m2 = [m, m, m];

Как нетрудно догадаться, квадратные скобки для массива – это то же самое, что кавычки для строки. Они ограничивают массив и по ним транслятор языка понимает, как с ним работать.

В общем, массивы – это мощные инструменты работы с областями памяти. И работать с ними придется практически постоянно.

Остается один вопрос – а для чего это всё? Ну ладно, мы сохранили массив в памяти, мы получили какую-то последовательность байт. Для чего мы её сохранили, что делать с ней дальше? Всё это лучше объяснять на наглядных примерах. Поэтому в следующих выпусках я буду воображать, будто бы пишу какую-то компьютерную игру, ставить какие-то конкретные задачи и находить решения. Попутно, конечно, вдаваясь в общие рассуждения.

Наука
7 млн интересуются