РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1217 of 1245 menu

Метод offset

Метод offset является небезопасным методом для сырых указателей *const T и *mut T. Он возвращает новый указатель, смещённый относительно исходного на указанное количество элементов типа T. Параметром метод принимает количество элементов count, на которое нужно сместить указатель. Значение count может быть отрицательным, что позволяет смещаться в обратном направлении. Метод не проверяет границы памяти, поэтому вызывающий обязан гарантировать, что итоговый указатель указывает на допустимую память или на позицию сразу за концом выделенного блока.

Синтаксис

unsafe { ptr.offset(count) }

Пример

Давайте создадим массив и получим указатель на его первый элемент, а затем сместим его на два элемента вперёд:

fn main() { let arr = [10, 20, 30, 40, 50]; let ptr = arr.as_ptr(); unsafe { let shifted = ptr.offset(2); println!("{}", *shifted); } }

Результат выполнения кода:

30

Пример

Давайте сместим указатель на два элемента назад относительно третьего элемента массива:

fn main() { let arr = [10, 20, 30, 40, 50]; let ptr = arr.as_ptr(); unsafe { let third = ptr.offset(2); let back = third.offset(-2); println!("{}", *back); } }

Результат выполнения кода:

10

Пример

Давайте используем изменяемый указатель и изменим значение по смещённому адресу:

fn main() { let mut arr = [10, 20, 30, 40, 50]; let ptr = arr.as_mut_ptr(); unsafe { let shifted = ptr.offset(3); *shifted = 99; } println!("{:?}", arr); }

Результат выполнения кода:

[10, 20, 30, 99, 50]

Смотрите также

  • метод add,
    который смещает указатель вперёд на заданное число элементов
  • метод sub,
    который смещает указатель назад на заданное число элементов
  • метод wrapping_add,
    который выполняет смещение указателя с зацикливанием адреса
  • метод as_ptr,
    который получает сырой указатель на данные
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить