web-dev-qa-db-ja.com

ポインタを印刷すると、逆参照されたポインタを印刷するのと同じことが印刷されるのはなぜですか?

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?ある種の自動逆参照はありますか、それとも何かを見逃しましたか?

30
Vega

Rustは通常、オブジェクトID(メモリアドレス)ではなく、オブジェクト値(つまり、コンテンツの興味深い部分)に焦点を当てています。 Displayの実装 for &Tここで、TDisplayを実装し、コンテンツに直接依存します。 StringDisplay実装用にそのマクロを手動で展開します。

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

つまり、コンテンツを直接印刷するだけです。

オブジェクトのアイデンティティ/メモリアドレスを気にする場合は、 Pointer formatter{:p}

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

遊び場

30
huon
fn main() {
 let x = &42;
 let address = format!("{:p}", x); // this produces something like '0x7f06092ac6d0'
 println!("{}", address);
}
1
Deepak G