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

Veg*_*ega 26 pointers dereference rust

来自Rust指南:

要取消引用(获取引用的值而不是引用本身)y,我们使用星号(*)

所以我做到了:

fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}", x, *ptr_y);
}
Run Code Online (Sandbox Code Playgroud)

即使没有明确的解引用,这也给了我相同的结果(x = 1; y = 1):

fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}", x, ptr_y);
}
Run Code Online (Sandbox Code Playgroud)

为什么?不应该ptr_y打印内存地址并*ptr_y打印1?是否有某种自动解除引用或者我错过了什么?

huo*_*uon 32

Rust通常关注对象值(即内容的有趣部分)而不是对象标识(内存地址).该实施Display&T,其中T工具Display直接对推迟的内容.手动扩展该宏以String实现Display:

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

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

如果你关心对象标识/的内存地址,你可以使用Pointer格式化,{:p}:

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

输出:

x: 1, ptr_y: 1, address: 0x7fff4eda6a24
Run Code Online (Sandbox Code Playgroud)

操场

  • [类型被指定为`let x:Type = 1;`](http://doc.rust-lang.org/nightly/guide.html#variable-bindings). (4认同)
  • 哦,是的,`{:p}`也可以工作,`p` [格式说明符](http://doc.rust-lang.org/nightly/std/fmt/#formatting-traits)是[实现的]各种指针](http://doc.rust-lang.org/nightly/std/fmt/trait.Pointer.html)只打印地址. (3认同)
  • 我在Rust指南中阅读了一些关于指针的信息,他们只使用"{:p},ptr_y",因为"println!会自动为我们取消引用".一个简短的问题:我通常使用"Type name = value"或"int test = 1"之类的东西.看来我在Rust中没有那个选项,"let int test = 1"给出了编译错误?我知道编译器自动获取类型但是为了我的语法我想在我的代码中声明:(.无论如何,感谢你的答案,即使我不知道宏正在做什么:). (2认同)

Dee*_*k G 8

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