来自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吗?是否有某种自动取消引用或者我错过了什么?
答案 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 Display
,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
输出:
{{1}}
答案 1 :(得分:0)
fn main() {
let x = &42;
let address = format!("{:p}", x); // this produces something like '0x7f06092ac6d0'
println!("{}", address);
}