对于Rust而言,指针就是包含某个值(value)的地址的值。
第一、要有指向,即value
第二、本身也有值,但其值是特殊的值,类似于0x26b315f794的内存地址值。
别看很简单,但Rust还用法很多,功能很强大。
本内容部分有引用《Rust essentials》部分,特此说明。
1、pointer
更多的是borrowed pointer 。
let mut mynum = 5.0_f32;//value
let mut temp = &mynum; // a pointer
//let mut temp = &mut mynum; // a pointer is ok!
let sqrtnum = (*temp).sqrt();//真实的情况
//let sqrtnum = temp.sqrt();//当然也是可以这样的
println!("sqrt :{}", sqrtnum);
println!("temp address {:p}",temp);//0x26b315f794
2、ref
等同于&
let ref temp2 = &mynum;
println!("temp2 address :{:p}", temp2); //0xf57696f8b0
let mut num = 6.0_f32;
let ref mut temp3 = &mut num;
println!("temp3 address :{:p}", temp3); //0xcc6152f330
let s: String = "abc".to_string();
let ref refs = &s;
let rf = &s;
//assert_eq!(rf, refs);
println!("refs: {:p}", refs);
println!("& : {:p}", rf);
output:
refs: 0x424d1ff820
& : 0x424d1ff800
这个经常也和match 搭配,这里就不详细描述了。
3、Box
当你想写一个函数,其返回值是一个函数时侯,Box是一个很好伙伴。他小心地帮你包装好,你不需要操太多心。
let mut bx = Box::new(42);
println!("bx before :{:?}", bx); //42
*bx = 43; //bx 必须有mut
println!("bx after :{:?}", bx); //43
let mut bx_1 = &*bx;
println!("bx_1 :{:?}", bx_1); //43
4、as_ptr()
let mut strs = "hello".to_string();
for _ in 0..10 {
println!("address :{:?} capacity:{:?} ,len:{:?}",
strs.as_ptr(),
strs.capacity(),
strs.len());
strs.push_str("!");
}
println!("push ended!");
println!("address :{:?} capacity:{:?} ,len:{:?}",
strs.as_ptr(),
strs.capacity(),
strs.len());
output:
address :0x23841297950 capacity:5 ,len:5
address :0x23841297950 capacity:10 ,len:6
address :0x23841297950 capacity:10 ,len:7
address :0x23841297950 capacity:10 ,len:8
address :0x23841297950 capacity:10 ,len:9
address :0x23841297950 capacity:10 ,len:10
address :0x23841294cb0 capacity:20 ,len:11
address :0x23841294cb0 capacity:20 ,len:12
address :0x23841294cb0 capacity:20 ,len:13
address :0x23841294cb0 capacity:20 ,len:14
push ended!
address :0x23841294cb0 capacity:20 ,len:15
5、&trait
6、rc : 引用计数
如果你对一个不变值的对象,需要多次引用,且在一个线程中,rc可能能帮上你的忙,这个时侯,你只需要在值后面加一个clone().
7、Cell,RefCell
8、Arc
9、&[T]->&[U]
10、raw pointer: *const T, and *mut T
11、borrow()
use std::cell::{RefCell, Ref};
let c = RefCell::new((5, 'b'));
let b1: Ref<(u32, char)> = c.borrow();
let b2: Ref<u32> = Ref::map(b1, |t| &t.0);
assert_eq!(*b2, 5)