14-指针类型

指针类型 — The Rust Reference

译文 · 基于 The Rust Reference

原文链接: https://doc.rust-lang.org/reference/types/pointer.html

r[type.pointer]

指针类型

r[type.pointer.intro] 所有指针都是显式的一等值。它们可以被移动或复制,存入数据结构,以及从函数返回。

r[type.pointer.reference]

引用(& 和 &mut)

r[type.pointer.reference.syntax]

ReferenceType -> `&` Lifetime? `mut`? TypeNoBounds

r[type.pointer.reference.shared]

共享引用(&)

r[type.pointer.reference.shared.intro] 共享引用指向由某个其他值所拥有的内存。

r[type.pointer.reference.shared.constraint-mutation] 当创建指向某个值的共享引用时,它会阻止对该值的直接修改。内部可变性在某些情况下为此提供了例外。顾名思义,可以存在任意数量指向同一值的共享引用。共享引用类型写作 &type,或者在需要指定显式生命周期时写作 &'a type。

r[type.pointer.reference.shared.copy] 复制引用是一种「浅」操作:它只涉及复制指针本身,也就是说,指针是 Copy 的。释放引用对其所指向的值没有影响,但对临时值的引用会在该引用自身的作用域内保持该临时值存活。

r[type.pointer.reference.mut]

可变引用(&mut)

r[type.pointer.reference.mut.intro] 可变引用指向由某个其他值所拥有的内存。可变引用类型写作 &mut type 或 &'a mut type。

r[type.pointer.reference.mut.copy] 可变引用(尚未被再借用的)是访问其所指向值的唯一方式,因此不是 Copy 的。

r[type.pointer.raw]

裸指针(*const 和 *mut)

r[type.pointer.raw.syntax]

RawPointerType -> `*` ( `mut` | `const` ) TypeNoBounds

r[type.pointer.raw.intro] 裸指针是没有安全性或存活性保证的指针。裸指针写作 *const T 或 *mut T。例如 *const i32 表示指向 32 位整数的裸指针。

r[type.pointer.raw.copy] 复制或 drop 裸指针对任何其他值的生命周期都没有影响。

r[type.pointer.raw.safety] 解引用裸指针是一种 unsafe 操作。

这也可以通过再借用(&* 或 &mut *)将裸指针转换为引用。一般不鼓励使用裸指针;它们的存在是为了支持与外部代码的互操作,以及编写性能关键或底层的函数。

r[type.pointer.raw.cmp] 比较裸指针时,比较的是它们的地址,而不是它们所指向的内容。比较指向动态大小类型的裸指针时,还会比较它们的附加数据。

r[type.pointer.raw.constructor] 裸指针可以直接使用 &raw const 创建 *const 指针,使用 &raw mut 创建 *mut 指针。

r[type.pointer.smart]

智能指针

标准库在引用和裸指针之外还包含额外的「智能指针」类型。

r[type.pointer.validity]

位有效性

r[type.pointer.validity.pointer-fragment] 尽管在大多数平台发出的机器码中,指针和引用类似于 usize,但将引用或指针类型 transmute 为非指针类型的语义目前尚未确定。因此,将指针或引用类型 P transmute 为 [u8; size_of::<P>()] 可能并不合法。

r[type.pointer.validity.raw] 对于瘦裸指针(即对于 T: Sized,P = *const T 或 P = *mut T),反向(将整数或整数数组 transmute 为 P)始终合法。然而,通过这种 transmute 产生的指针可能无法被解引用(即使 T 的大小为零也不行)。

最后修改 August 21, 2026: 更新 (76fc81a2e)