Метод 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,
которая создаёт срез из сырого указателя и длины