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

Метод as_ptr

Метод as_ptr возвращает сырой указатель типа *const T на первый элемент коллекции или на внутренние данные умного указателя. Метод не принимает параметров и не требует блока unsafe для вызова, однако разыменование полученного указателя уже является небезопасной операцией.

Метод доступен для таких типов, как Vec, String, Box, Rc, Arc, CString и многих других. Возвращаемый указатель действителен до тех пор, пока коллекция не будет изменена или уничтожена.

Синтаксис

collection.as_ptr()

Пример

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

fn main() { let v = vec![1, 2, 3, 4, 5]; let ptr = v.as_ptr(); println!("{:?}", ptr); }

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

0x7ffd5e8b1a40

Пример

Давайте с помощью метода as_ptr и небезопасного разыменования прочитаем первый элемент вектора:

fn main() { let v = vec![10, 20, 30]; let ptr = v.as_ptr(); let first = unsafe { *ptr }; println!("{}", first); }

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

10

Пример

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

fn main() { let s = String::from("abcde"); let ptr = s.as_ptr(); let first_byte = unsafe { *ptr }; println!("{}", first_byte); }

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

97

Пример

Давайте передадим полученный указатель в функцию slice_from_raw_parts, чтобы создать срез из вектора:

fn main() { let v = vec![1, 2, 3, 4, 5]; let ptr = v.as_ptr(); let len = v.len(); let s = unsafe { std::slice::from_raw_parts(ptr, len) }; println!("{:?}", s); }

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

[1, 2, 3, 4, 5]

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

  • метод as_mut_ptr,
    который возвращает изменяемый сырой указатель
  • тип const-pointer,
    который представляет сырой неизменяемый указатель
  • тип mut-pointer,
    который представляет сырой изменяемый указатель
  • функция slice_from_raw_parts,
    которая создаёт срез из сырого указателя и длины
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить