# Macro std::ptr::addr_of

1.51.0 · source ·

    pub macro addr_of($place:expr) {
        ...
    }

Expand description

Create a `const` raw pointer to a place, without creating an intermediate reference.

Creating a reference with `&`/`&mut` is only allowed if the pointer is properly aligned and points to initialized data. For cases where those requirements do not hold, raw pointers should be used instead. However, `&expr as *const _` creates a reference before casting it to a raw pointer, and that reference is subject to the same rules as all other references. This macro can create a raw pointer without creating a reference first.

Note, however, that the `expr` in `addr_of!(expr)` is still subject to all the usual rules. In particular, `addr_of!(*ptr::null())` is Undefined Behavior because it dereferences a null pointer.

## Example

    use std::ptr;

    #[repr(packed)]
    struct Packed {
        f1: u8,
        f2: u16,
    }

    let packed = Packed { f1: 1, f2: 2 };
    // `&packed.f2` would create an unaligned reference, and thus be Undefined Behavior!
    let raw_f2 = ptr::addr_of!(packed.f2);
    assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);

Run

See `addr_of_mut` for how to create a pointer to uninitialized data. Doing that with `addr_of` would not make much sense since one could only read the data, and that would be Undefined Behavior.