Это выражение в Rust приводит изменяемую ссылку в "сырый" указатель. Конкретно: - `r1` получит тип `*mut i32`. - `&mut x as *mut i32` берёт mutable reference `&mut x` и кастует её в raw pointer `*mut i32` (без копирования адреса). - Такой указатель обходится без проверки borrow checker — чтение/запись через него безопасны только внутри `unsafe` блока. Короткий пример (для иллюстрации; числовые литералы выделены KaTeX): let mut x = 101010; let r1 = &mut x as *mut i32; unsafe { *r1 = 555; // присвоение через сырый указатель println!("{}", *r1); } Замечания: - Приведение не меняет адреса и выполняется в ноль затрат. - Дехранилище/доступ через `r1` небезопасны (требуют `unsafe`). - `*mut` не несёт lifetime — вы обязаны гарантировать, что `x` жив, пока используете `r1`. - Для безопасного получения адреса поля в некоторых случаях предпочтительнее `std::ptr::addr_of_mut!` (избегает создания промежуточной ссылки). - По возможности используйте обычные ссылки `&`/`&mut`; raw pointers нужны для FFI и низкоуровневых задач.
- `r1` получит тип `*mut i32`.
- `&mut x as *mut i32` берёт mutable reference `&mut x` и кастует её в raw pointer `*mut i32` (без копирования адреса).
- Такой указатель обходится без проверки borrow checker — чтение/запись через него безопасны только внутри `unsafe` блока.
Короткий пример (для иллюстрации; числовые литералы выделены KaTeX):
let mut x = 101010;
let r1 = &mut x as *mut i32;
unsafe {
*r1 = 555; // присвоение через сырый указатель
println!("{}", *r1);
}
Замечания:
- Приведение не меняет адреса и выполняется в ноль затрат.
- Дехранилище/доступ через `r1` небезопасны (требуют `unsafe`).
- `*mut` не несёт lifetime — вы обязаны гарантировать, что `x` жив, пока используете `r1`.
- Для безопасного получения адреса поля в некоторых случаях предпочтительнее `std::ptr::addr_of_mut!` (избегает создания промежуточной ссылки).
- По возможности используйте обычные ссылки `&`/`&mut`; raw pointers нужны для FFI и низкоуровневых задач.