Указатели и срезы
Адрес дома не содержит число квартир. А список квартир вместе с адресом позволяет обходить их, не заходя в соседнее здание. В памяти похожая разница: указатель отвечает «где», срез добавляет «сколько». Оба смотрят на существующие данные, но знают о них разное.
У нас три измерения температуры. Не станем копировать весь журнал ради чтения первых двух. Возьмём окно на нужную часть и проверим, что изменилось в исходных данных.
Одна мысль урока
Срез это адрес и длина, а не новая копия элементов.
Опора из прошлого урока: Условия, циклы и блоки.
От картинки к записи
Указатель
*u16 обозначает адрес одного числа. Оператор & получает адрес существующего объекта, p.*
читает или меняет объект по этому адресу. Адрес отличается от самого числа: копирование указателя
создаёт ещё один путь к тем же данным.
Срез
[]u16 содержит указатель и длину. []const u16 разрешает читать, но не менять элементы через этот
срез. Это удобный тип параметра для функции, которая обрабатывает список и не обязана владеть его
памятью. Размер списка не входит в имя типа, поэтому одна функция принимает два элемента и двести.
Запись values[0..2] выбирает элементы с индексами 0 и 1. Правая граница не входит в окно. Такой договор делает длину простой разностью: 2 - 0. Индекс values[0] обозначает первый элемент, а не нулевое место до массива. В программировании отсчёт с нуля помогает считать смещение от начала.
Срез ничего не выделяет и не копирует. Если через изменяемое окно присвоить второй элемент, исходный массив тоже изменится. Для отдельной копии нужен другой массив или явное выделение памяти. Благодаря этому срез удобен, но у него есть условие: исходные данные должны жить всё время использования окна.
Срок жизни
не хранится отдельным таймером в срезе. Нельзя возвращать окно на локальный массив функции, если массив перестаёт существовать после возврата. Даже правильная длина не спасает адрес исчезнувших данных. Проверки границ решают другую задачу: не выйти за конец ещё существующего списка.
У const view: []u16 нельзя заменить сам срез новым окном, но можно менять элементы через него. У []const u16 запрещена запись в элементы независимо от того, как объявлено имя. Это два уровня: привязка имени и доступ к содержимому. Читай их отдельно.
В Debug и ReleaseSafe индекс за длиной вызывает проверку. В ReleaseFast рассчитывать на такую защиту нельзя. Для многоуказателя без длины сравнивать вообще не с чем. Поэтому для обычной обработки списка начинай со среза, а более слабое представление используй только при ясном внешнем договоре.
премиум-урок
Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.
Оплата пока не подключена: премиум и курсы открываются промокодом.