diff --git a/src/ch01.md b/src/ch01.md index a76610b..e81a243 100644 --- a/src/ch01.md +++ b/src/ch01.md @@ -332,3 +332,32 @@ pub fn init(name: []const u8, power: u64) User { ## Массивы и срезы +Мы могли бы обойти молчанием последнюю строчку нашего примера (`name: []const u8`), +но, поскольку этот пример содержит аж 2 строковые константы (`"Пётр"` и `"{s} обладает силой {d}\n"`), +то наверняка Вы любопытствуете по поводу строк в Zig. Чтобы лучше понимать строки, +нужно сначала ознакомиться с массивами и срезами. + +Массивы имеют фиксированный размер, их длина (количество элементов) известна +во время компиляции. Длина является составляющей частью типа, то есть +массив из 4-х знаковых целых (`[4]i32`) и массив из 5-ти знаковых целых (`[5]i32`) - +это разные типы. + +Длина массива может быть выведена из его инициализатора. В следующем отрывке кода +все 3 массива имют тип `[5]i32`: + +```zig +const a = [5]i32{1, 2, 3, 4, 5}; + +// мы уже видели синтаксис .{...} со структурами +// он также работает и с массивами +const b: [5]i32 = .{1, 2, 3, 4, 5}; + +// используйте _, тогда компилятор сам вычислит длину +const c = [_]i32{1, 2, 3, 4, 5}; +``` + +С другой стороны, срез - это пара указатель плюс длина, при этом длина +становится известной лишь при исполнении программы. Мы пройдёмся +по указателям далее, а пока Вы можете представлять себе срез как некое "окно" +в массиве. +