gotcharustCritical
Why does printing a pointer print the same thing as printing the dereferenced pointer?
Viewed 0 times
pointerthingwhyprintingsamedereferencedthedoesprint
Problem
From the Rust guide:
To dereference (get the value being referred to rather than the reference itself)
So I did it:
This gives me the same results (x=1; y=1) even without an explicit dereference:
Why? Shouldn't
To dereference (get the value being referred to rather than the reference itself)
y, we use the asterisk (*)So I did it:
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, *ptr_y);
}This gives me the same results (x=1; y=1) even without an explicit dereference:
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, ptr_y);
}Why? Shouldn't
ptr_y print the memory address and *ptr_y print 1? Is there some kind of auto-dereference or did I miss something?Solution
Rust usually focuses on object value (i.e. the interesting part of the contents) rather than object identity (memory addresses). The implementation of
That is, it is just printing its contents directly.
If you care about object identity/the memory address, you can use the
Output:
playground
Display for &T where T implements Display defers directly to the contents. Expanding that macro manually for the String implementation of Display:impl 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
Code Snippets
impl<'a> Display for &'a String {
fn fmt(&self, f: &mut Formatter) -> Result {
Display::fmt(&**self, f)
}
}fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}, address: {:p}", x, ptr_y, ptr_y);
}Context
Stack Overflow Q#27852613, score: 101
Revisions (0)
No revisions yet.