Rust中多级引用打印变量栈地址的代码含义解析
为什么Rust中多重取地址(&&b、&&&b等)能编译且输出不同地址?
问题代码
fn main () { let mut b = 3; println!("in main i32 {:p}", &b); println!("in main i32 {:p}", &&b); println!("in main i32 {:p}", &&&b); println!("in main i32 {:p}", &&&&b); println!("in main i32 {:p}", &&&&&b); }
疑问
原本以为除第一个println!外其余都会触发编译错误,但代码成功编译运行,且每次调用输出的地址均不相同,这是为什么?
解答
这背后是Rust的临时变量和引用特性在起作用:
- 每多一层
&,都会在上一层引用的基础上创建一个临时引用变量。比如&&b其实等价于&(&b):先通过&b生成一个&i32类型的临时引用,再对这个临时引用取地址,得到&&i32类型的新引用。 - 这些临时引用都会被单独分配在栈内存的不同位置,所以每次
println!输出的地址自然不一样。 - 至于编译通过的原因:
{:p}格式符支持所有实现了Pointertrait的类型,而Rust里所有引用类型(不管是多少层的嵌套引用)都自动实现了这个trait,因此可以直接被格式化为地址输出。
内容的提问来源于stack exchange,提问作者PaulCommentary
相关产品推荐
相关产品推荐

