Rust : Pointer......to be continued

对于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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值