You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}格式符支持所有实现了Pointer trait的类型,而Rust里所有引用类型(不管是多少层的嵌套引用)都自动实现了这个trait,因此可以直接被格式化为地址输出。

内容的提问来源于stack exchange,提问作者PaulCommentary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:14:56