Rust 解引用本质
Rust 解引用本质
我们知道 rust 引用使用 &,解引用使用 *,于是 * 解引用就拥有了数据所有权,但是我们想要使用解引用的数据,必须赋给一个变量,这样一旦发生赋值,那么如果该类型实现了 Trait 特性, 就是使用 Copy 语义,否则使用 Move 语义。
整形例子:
fn main() {
let a: i32 = 12;
let b = &a;
let c = *b; // *b 取得12,然后发生 12 copy 到定义的 c,所以 b 和 c 的地址不一样
println!("{:p}, {:p}", b, &c); //0x7ffee2fe0624, 0x7ffee2fe0634
//如果不赋值
let c = &*b; // c 也是对 a 的一个引用, 那么 b == c
println!("{:p}, {:p}", b, c); //0x7ffee2fe0624, 0x7ffee2fe0624
println!("{:p}, {:p}", b, &c); //0x7ffee2fe0624, 0x7ffee2fe06a0
}
字符串例子
fn main() {
//字符串
let str: String = String::from("rwkey.com");
let str1 = &str;
//let str2 = *str1; //赋值,会 move 改变所有权,这是不允许的, 它想取,但取不到
let str3 = &*str1; //还是借用
println!("{:p}, {:p}", str1, str3); //0x7ffee2fe0770, 0x7ffee2fe0770
println!("{:p}, {:p}", str1, &*str1); // &* 就是指向原变量 0x7ffee2fe0770, 0x7ffee2fe0770
println!("{:p}, {:p}", str1, &&*str1); // &&* 就是引用的指针 0x7ffee2fe0770, 0x7ffee2fe08c8
}