ptr::addr_of!() 与 ptr::addr_of_mut!() 宏

这两个宏用于取得变量的内存地址, 它们分别返回的是 *const T*mut T. 它们不需要先经过 "创建引用" 这一步, 因为有些情况, 当结构体的内存未对齐时, 是不能创建引用的.

use std::ptr;

#[derive(Debug, Default)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let mut point = Point::default();
    let x_ptr: *const i32 = ptr::addr_of!(point.x);
    unsafe {
        assert_eq!(ptr::read(x_ptr), 0);
    }
    let y_ptr: *mut i32 = ptr::addr_of_mut!(point.y);
    unsafe {
        ptr::write(y_ptr, 42);
    }
    assert_eq!(point.y, 42);
}