一、&
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