Сырой указатель *const T
Сырой указатель *const T - это неизменяемый сырой указатель
на значение типа T. В отличие от обычных ссылок,
сырые указатели не гарантируют ни валидность адреса,
ни время жизни, ни выравнивание. Компилятор не отслеживает
такие указатели, поэтому разыменование *const T
возможно только внутри блока unsafe. Сырые указатели
часто применяются при взаимодействии с C-кодом, при работе
с аллокаторами и при реализации собственных структур данных.
Значение типа *const T можно получить с помощью
оператора взятия ссылки &, метода as_ptr
или функций вроде std::ptr::null.
Синтаксис
let ptr: *const T = &value as *const T;
Также сырой указатель можно создать из изменяемой ссылки или получить через приведение типов:
let ptr: *const T = &mut value as *const T;
Пример
Давайте создадим сырой указатель *const i32
на переменную и безопасно прочитаем значение
через блок unsafe:
fn main()
{
let value: i32 = 42;
let ptr: *const i32 = &value;
unsafe
{
println!("{}", *ptr);
}
}
Результат выполнения кода:
42
Пример
Давайте получим сырой указатель на первый элемент
вектора с помощью метода as_ptr и прочитаем его:
fn main()
{
let vec = vec![1, 2, 3, 4, 5];
let ptr: *const i32 = vec.as_ptr();
unsafe
{
println!("{}", *ptr);
}
}
Результат выполнения кода:
1
Пример
Давайте проверим, является ли сырой указатель
нулевым, с помощью метода is_null:
fn main()
{
let value: i32 = 100;
let ptr: *const i32 = &value;
let null_ptr: *const i32 = std::ptr::null();
println!("{}", ptr.is_null());
println!("{}", null_ptr.is_null());
}
Результат выполнения кода:
false
true
Пример
Давайте сместим сырой указатель на следующий элемент
массива с помощью метода offset:
fn main()
{
let arr = [10, 20, 30, 40, 50];
let ptr: *const i32 = arr.as_ptr();
unsafe
{
let next = ptr.offset(2);
println!("{}", *next);
}
}
Результат выполнения кода:
30