pointers - punteros - ¿Por qué imprimir un puntero imprime lo mismo que imprimir el puntero desreferenciado?
punteros en c ejemplos (2)
El óxido generalmente se centra en el valor del objeto (es decir, la parte interesante de los contenidos) en lugar de la identidad del objeto (direcciones de memoria).
La
implementación de
Display
for
&T
donde
T
implementa
Display
difiere directamente a los contenidos.
Expandir esa macro manualmente para la implementación de
String
de
Display
:
impl<''a> Display for &''a String {
fn fmt(&self, f: &mut Formatter) -> Result {
Display::fmt(&**self, f)
}
}
Es decir, solo está imprimiendo su contenido directamente.
Si le interesa la identidad del objeto / la dirección de memoria, puede usar el
formateador de
Pointer
,
{:p}
:
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}, address: {:p}", x, ptr_y, ptr_y);
}
Salida:
x: 1, ptr_y: 1, address: 0x7fff4eda6a24
De la guía Rust:
Para desreferenciar (obtener el valor al que se hace referencia en lugar de la referencia en sí)
y
, usamos el asterisco (*
)
Entonces lo hice:
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, *ptr_y);
}
Esto me da los mismos resultados (x = 1; y = 1) incluso sin una desreferencia explícita:
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, ptr_y);
}
¿Por qué?
¿No debería
ptr_y
imprimir la dirección de memoria y
*ptr_y
print 1?
¿Hay algún tipo de autorreferencia o me perdí algo?
fn main() {
let x = &42;
let address = format!("{:p}", x); // this produces something like ''0x7f06092ac6d0''
println!("{}", address);
}