为什么打印指针与打印解引用指针的结果相同?

70

来自Rust指南:

要对解引用(获取被引用值而不是引用本身)y,我们使用星号 (*)。

所以我这样做了:

fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}", x, *ptr_y);
}
这给了我相同的结果(x=1; y=1),即使没有明确引用:
fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}", x, ptr_y);
}
为什么?ptr_y 不应该打印内存地址,*ptr_y 打印1吗?是有某种自动解引用吗,还是我漏了什么?
2个回答

97

Rust通常关注对象值(即内容的有趣部分)而不是对象标识(内存地址)。对于实现了Display&T其实现方式直接延迟到内容。手动展开该宏以实现StringDisplay

impl<'a> Display for &'a String {
    fn fmt(&self, f: &mut Formatter) -> Result {
        Display::fmt(&**self, f)
    }
}

也就是说,它只是直接打印其内容。如果您关心对象的标识/内存地址,您可以使用“Pointer”格式化程序 {:p}
fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}, address: {:p}", x, ptr_y, ptr_y);
}

输出:

x: 1, ptr_y: 1, address: 0x7fff4eda6a24

playground


2
我在你发布后不久阅读了 Rust 指南中关于指针的部分,他们只是使用 "{:p}, ptr_y",因为 "println! 会自动为我们解引用它"。一个简短的问题: 我通常使用类似 "Type name = value" 或 "int test = 1" 的语法。但好像在 Rust 中我不能这样做,"let int test = 1" 会导致编译器错误?我知道编译器可以自动获取类型,但出于语法的考虑,我希望在声明时在我的代码中写出它 :(。无论如何,感谢您的回答,即使我不知道宏确切的作用 :). - Vega
3
是的,{:p}也可以使用,p格式说明符,可用于各种指针类型上,以打印地址。 - huon
4
类型被指定为 let x: Type = 1; - huon
好的,这就是我需要知道的全部内容:)。现在我需要掌握更大的东西,我只习惯于面向对象编程,对于这之后的任何东西(http://doc.rust-lang.org/book/intermediate.html),特别是模板和泛型,我一无所知。 感谢您的帮助。 - Vega

8
fn main() {
 let x = &42;
 let address = format!("{:p}", x); // this produces something like '0x7f06092ac6d0'
 println!("{}", address);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接