Why does printing a pointer print the same thing as printing the dereferenced pointer?

前端 未结 2 1735
忘掉有多难
忘掉有多难 2020-11-29 09:18

From the Rust guide:

To dereference (get the value being referred to rather than the reference itself) y, we use the asterisk (*

相关标签:
2条回答
  • 2020-11-29 09:37

    Rust usually focuses on object value (i.e. the interesting part of the contents) rather than object identity (memory addresses). The implementation of Display for &T where T implements Display defers directly to the contents. Expanding that macro manually for the String implementation of Display:

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

    That is, it is just printing its contents directly.

    If you care about object identity/the memory address, you can use the Pointer formatter, {:p}:

    fn main() {
        let x = 1;
        let ptr_y = &x;
        println!("x: {}, ptr_y: {}, address: {:p}", x, ptr_y, ptr_y);
    }
    

    Output:

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

    playground

    0 讨论(0)
  • 2020-11-29 09:37
    fn main() {
     let x = &42;
     let address = format!("{:p}", x); // this produces something like '0x7f06092ac6d0'
     println!("{}", address);
    }
    
    0 讨论(0)
提交回复
热议问题