Rust通過(guò)限制智能指針的行為保障了編譯時(shí)安全,不過(guò)仍需要對(duì)指針做一些額外的操作。
*const T
和*mut T
在Rust中被稱為“裸指針”。它允許別名,允許用來(lái)寫共享所有權(quán)的類型,甚至是內(nèi)存安全的共享內(nèi)存類型如:Rc<T>
和Arc<T>
,但是賦予你更多權(quán)利的同時(shí)意味著你需要擔(dān)當(dāng)更多的責(zé)任:
&
,因此編譯器不能判斷出懸垂指針*const T
改變外,沒(méi)有別名或可變性的保障創(chuàng)建一個(gè)裸指針:
let a = 1;
let b = &a as *const i32;
let mut x = 2;
let y = &mut x as *mut i32;
解引用需要在unsafe
中進(jìn)行:
let a = 1;
let b = &a as *const i32;
let c = unsafe { *b };
println!("{}", c);
Box<T>
的into_raw
:
let a: Box<i32> = Box::new(10);
// 我們需要先解引用a,再隱式把 & 轉(zhuǎn)換成 *
let b: *const i32 = &*a;
// 使用 into_raw 方法
let c: *const i32 = Box::into_raw(a);
如上說(shuō)所,引用和裸指針之間可以隱式轉(zhuǎn)換,但隱式轉(zhuǎn)換后再解引用需要使用unsafe
:
// 顯式
let a = 1;
let b: *const i32 = &a as *const i32; //或者let b = &a as *const i32;
// 隱式
let c: *const i32 = &a;
unsafe {
println!("{}", *c);
}