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

println!宏是否递归解引用?为何多级引用打印结果一致?

Rust多级引用使用println!打印值一致的原因

先看示例代码:

fn main() {
    let value = 42;
    let reference: &i32 = &value;
    let reference2: &&i32 = &&value;
    let reference3: &&&i32 = &reference2;
    
    println!("     Value: {}", value);      // 输出: 42
    println!(" Reference: {}", reference);  // 输出: 42
    println!("Reference2: {}", reference2); // 输出: 42
    println!("Reference3: {}", reference3); // 输出: 42
}

问题

为什么打印不同层级的引用时,输出结果都是底层值42,而非对应的内存地址?Display的实现是否会递归解引用直到获取到值?

解答

  1. Display trait的自动解引用逻辑
    当某个类型T实现了Display trait,Rust会为所有层级的引用类型(&T、&&T、&&&T...)自动实现Display,实现逻辑就是递归解引用,直到调用到底层T的Display方法。所以不管传递多少层引用给println!的{}占位符,最终都会打印底层值。

  2. 如何打印引用的地址
    如果需要打印引用对应的内存地址,要使用专门的格式化占位符{:p},它会直接输出指针的内存地址。示例:

println!("Reference address: {:p}", reference);  // 输出类似: 0x7ffdxxxxxx

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:33:13