我看到一些代码,看起来像这样:
fn test <'a> (&'a mut &'a str) {}
我知道'a '是一生,那是一生。是一个引用。
但是我很难理解双引用&&
在我的理解中,引用是一个指针,&&指向另一个指针的指针还是别的什么?
在我的理解中引用是一个指针
是的,引用只是一个具有特殊借用检查语义的指针。指针和引用只是内存中的地址(有时也有大小,但这与这个答案无关),这意味着它们本质上有自己的值,与它们"指向"的值分开。或"参考!"这就是为什么这样的代码可以工作:
fn main() {
let num1 = 1;
let num2 = 2;
let mut num_ref = &num1;
dbg!(num1, num2, num_ref); // num1 and num2 are 1 and 2 and num_ref is &1
num_ref = &num2;
dbg!(num1, num2, num_ref); // num1 and num2 are 1 and 2 and num_ref is &2
}
引用下的值没有改变,但是引用本身改变了。
因此,&mut &T
是对不可变引用的可变引用,这意味着您可以更改可变引用下面的引用:
fn make_reference_one(r: &mut &i32) {
*r = &1;
}
fn main() {
let mut num_ref = &2;
dbg!(num_ref); // is &2
make_reference_one(&mut num_ref);
dbg!(num_ref); // is now &1
}