指针类型
所有指针都是显式的第一类值。它们可以移动或复制,存储到数据结构中,并从函数返回。
引用 (&
和 &mut
)
共享引用 (&
)
共享引用指向由某个其他值拥有的内存。创建一个值的共享引用时,它会防止直接修改该值。 内部可变性 在某些情况下提供了一个例外。
顾名思义,可能存在对一个值的任意数量的共享引用。共享引用类型写作 &type
,或者在需要指定显式生命周期时写作 &'a type
。
复制引用是一个 "浅层" 操作:它只涉及到指针本身的复制,也就是说,指针是 Copy
的。
释放引用对它所指向的值没有影响,但引用 临时值 将在引用本身的作用域中保持其活动状态。
可变引用 (&mut
)
可变引用指向由某个其他值拥有的内存。可变引用类型写作 &mut type
或 &'a mut type
。
可变引用 (未被借用的) 是访问它所指向的值的唯一方式,因此不是 Copy
。
原始指针 (*const
and *mut
)
语法
原始指针类型 :
*
(mut
|const
) 无约束类型组
原始指针是非安全性或生存期保证的指针。原始指针写作 *const T
或 *mut T
。
例如, *const i32
意味着一个指向 32 位整数的原始指针。复制或丢弃原始指针不会对任何其他值的生命周期产生影响。
解引用原始指针是一个 unsafe
操作 。这也可以用于通过重新借用它 (&*
或 &mut *
) 将原始指针转换为引用。
通常不建议使用原始指针;其存在是为了支持与外部代码的互操作性,以及编写关键性能或低层的函数。
当比较原始指针时,是通过它们的地址进行比较,而不是通过它们所指向的内容进行比较。 当将原始指针与 动态大小类型 进行比较时,它们还会比较所附加的数据。
可以使用 core::ptr::addr_of!
创建 *const
指针和 core::ptr::addr_of_mut!
创建 *mut
指针来直接创建原始指针。
智能指针
标准库包含除了引用和原始指针之外的其他 '智能指针' 类型。