为什么打印指针打印与打印取消引用指针相同?

时间:2015-01-09 01:43:24

标签: pointers rust dereference

来自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 个答案:

答案 0 :(得分:26)

Rust通常关注对象值(即内容的有趣部分)而不是对象标识(内存地址)。 &T T Display String实现Display的{​​{3}}直接延迟到内容。为impl<'a> Display for &'a String { fn fmt(&self, f: &mut Formatter) -> Result { Display::fmt(&**self, f) } } 的{​​{1}}实施手动扩展该宏:

{:p}

也就是说,它只是直接打印其内容。

如果您关心对象标识/内存地址,可以使用implementation of Displayfn 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

输出:

{{1}}

Pointer formatter

答案 1 :(得分:0)

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