Rust
Сырые указатели
Поиск…
Синтаксис
- let raw_ptr = & pointee как * const type // создать постоянный необработанный указатель на некоторые данные
- let raw_mut_ptr = & mut pointee как * mut type // создать изменяемый необработанный указатель на некоторые изменчивые данные
- let deref = * raw_ptr // разыменовать необработанный указатель (требуется небезопасный блок)
замечания
- Исходные указатели не гарантируют указания на действительный адрес памяти и, как следствие, неосторожное использование может привести к неожиданным (и, возможно, фатальным) ошибкам.
- Любая нормальная ссылка Rust (например,
&my_object
где типmy_object
равна T) будет принуждать к*const T
Аналогично, изменяемые ссылки принуждают к*mut T
- Необработанные указатели не переносят права собственности (в отличие от значений Box)
Создание и использование постоянных исходных указателей
// Let's take an arbitrary piece of data, a 4-byte integer in this case
let some_data: u32 = 14;
// Create a constant raw pointer pointing to the data above
let data_ptr: *const u32 = &some_data as *const u32;
// Note: creating a raw pointer is totally safe but dereferencing a raw pointer requires an
// unsafe block
unsafe {
let deref_data: u32 = *data_ptr;
println!("Dereferenced data: {}", deref_data);
}
Вышеприведенный код будет выводить: Dereferenced data: 14
Создание и использование изменяемых исходных указателей
// Let's take a mutable piece of data, a 4-byte integer in this case
let mut some_data: u32 = 14;
// Create a mutable raw pointer pointing to the data above
let data_ptr: *mut u32 = &mut some_data as *mut u32;
// Note: creating a raw pointer is totally safe but dereferencing a raw pointer requires an
// unsafe block
unsafe {
*data_ptr = 20;
println!("Dereferenced data: {}", some_data);
}
Вышеприведенный код выведет: Dereferenced data: 20
Инициализация исходного указателя на нулевой
В отличие от обычных ссылок Rust, raw-указатели могут принимать нулевые значения.
use std::ptr;
// Create a const NULL pointer
let null_ptr: *const u16 = ptr::null();
// Create a mutable NULL pointer
let mut_null_ptr: *mut u16 = ptr::null_mut();
Цепной разыменования
Как и в C, Rust raw указатели могут указывать на другие необработанные указатели (которые, в свою очередь, могут указывать на дополнительные raw-указатели).
// Take a regular string slice
let planet: &str = "Earth";
// Create a constant pointer pointing to our string slice
let planet_ptr: *const &str = &planet as *const &str;
// Create a constant pointer pointing to the pointer
let planet_ptr_ptr: *const *const &str = &planet_ptr as *const *const &str;
// This can go on...
let planet_ptr_ptr_ptr = &planet_ptr_ptr as *const *const *const &str;
unsafe {
// Direct usage
println!("The name of our planet is: {}", planet);
// Single dereference
println!("The name of our planet is: {}", *planet_ptr);
// Double dereference
println!("The name of our planet is: {}", **planet_ptr_ptr);
// Triple dereference
println!("The name of our planet is: {}", ***planet_ptr_ptr_ptr);
}
Это выведет: The name of our planet is: Earth
четыре раза.
Отображение исходных указателей
У Rust есть форматирование по умолчанию для типов указателей, которые могут использоваться для отображения указателей.
use std::ptr;
// Create some data, a raw pointer pointing to it and a null pointer
let data: u32 = 42;
let raw_ptr = &data as *const u32;
let null_ptr = ptr::null() as *const u32;
// the {:p} mapping shows pointer values as hexadecimal memory addresses
println!("Data address: {:p}", &data);
println!("Raw pointer address: {:p}", raw_ptr);
println!("Null pointer address: {:p}", null_ptr);
Это выведет что-то вроде этого:
Data address: 0x7fff59f6bcc0
Raw pointer address: 0x7fff59f6bcc0
Null pointer address: 0x0
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow