Macro std::ptr::addr_of1.51.0[][src]

macro_rules! addr_of {
    ($place:expr) => { ... };
}
Expand description

创建一个 const 裸指针到一个位置,而无需创建中间引用。

仅当指针正确对齐并指向初始化数据时,才允许使用 &/&mut 创建引用。 对于那些不满足要求的情况,应改用裸指针。 但是,&expr as *const _ 在将其强制转换为裸指针之前会创建一个引用,并且该引用与所有其他引用都遵循相同的规则。

该宏可以创建一个裸指针,而无需先创建一个引用。

但是请注意,addr_of!(expr) 中的 expr 仍受所有常规规则的约束。 特别是,addr_of!(*ptr::null()) 是未定义行为,因为它解引用空指针。

Example

use std::ptr;

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

let packed = Packed { f1: 1, f2: 2 };
// `&packed.f2` 会导致未对齐的引用,从而成为未定义的行为!
let raw_f2 = ptr::addr_of!(packed.f2);
assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
Run

有关如何创建指向未初始化数据的指针,请参见 addr_of_mut。 用 addr_of 这样做没有多大意义,因为人们只能读取数据,这将是未定义行为。