Rust: &,clone,Box,Arc 的address

一、&

    println!();
    let temp = 500_i32;   //stack
    println!("&temp               : {:p}", &temp);
    println!("&&temp              : {:p}", &&temp);
    println!("&&&temp             : {:p}", &&&temp);
    println!("&&&&temp            : {:p}", &&&&temp);

    let arr = vec!["a", "b", "c", "d"]; // heap 

    println!();
    println!("&arr                : {:p}", &arr);
    println!("&&arr               : {:p}", &&arr);
    println!("&&&arr              : {:p}", &&&arr);
    println!("&&&&arr             : {:p}", &&&&arr);

output:

这里写图片描述

二、原始数据及clone

//原始数据
let mut array: [&str; 4] = ["a", "b", "c", "d"];
let mut num = 5_f32;
//clone
let array_clone = array.clone(); //clone:address和原来的不一样
let num_clone = num.clone();//clone:address和原来的不一样

三、不同情况下array的address


 println!("&array address          :{:p}", &array);
 println!("&array_clone address    :{:p}", &array_clone);

 let array_new = &mut array;// address不发生变化
 let array_new_clone = array_new.clone(); //address发生变化

 println!("array_new address       :{:p}", array_new);
 println!("&array_new address      :{:p}", &array_new);
 println!("&array_new_clone address:{:p}", &array_new_clone);
 println!();

四、不同情况下num的address

//&
println!("&num address            :{:p}", &num);
println!("&num_clone address      :{:p}", &num_clone);
//&mut,clone
let num_new = &mut num; // address不发生变化
let num_new_clone = num_new.clone();// address发生变化
// output
println!("num_new address         :{:p}", num_new);
println!("&num_new address        :{:p}", &num_new);
println!("&num_new_clone address  :{:p}", &num_new_clone);

output:

这里写图片描述

五、Box

    let mut bx = Box::new(5_f32);
    let mut bx_new = &bx;
    let mut bx_new_clone = bx_new.clone();
    println!("bx <value> address  : {:p}", &*bx);//box中5_f32的地址
    println!("bx address          : {:p}", &bx);//指针的指针
    println!("bx_new address      : {:p}", &bx_new);
    println!("bx_new_clone address: {:p}", &*bx_new_clone);

output:
这里写图片描述

六、Arc

以下例子参考RustPrimer

use std::thread;
use std::sync::Arc;

fn main() {
    let var : Arc<i32> = Arc::new(5);
    let share_var = var.clone();

    // 创建一个新线程
    let new_thread = thread::spawn(move|| {
        println!("share value in new thread: {}, address: {:p}", share_var, &*share_var);
    });

    // 等待新建线程先执行
    new_thread.join().unwrap();
    println!("share value in main thread: {}, address: {:p}", var, &*var);
}

output:

share value in new thread: 5, address: 0x2825070
share value in main thread: 5, address: 0x2825070
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值