指针类型

所有指针都是显式的一等值。 它们可以被移动或复制,存储到数据结构中,并从函数返回。

引用 (&&mut)

语法
引用类型 :
   & 生命周期? mut? 无界类型

共享引用 (&)

共享引用指向由其他值拥有的内存。

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

复制引用是一个“浅”操作:它只涉及复制指针本身,也就是说,指针是 Copy 的。 释放引用不会对其指向的值产生影响,但是引用 临时值 会使其在引用本身的范围内保持活动状态。

可变引用 (&mut)

可变引用指向由其他值拥有的内存。 可变引用类型写为 &mut type 或者 &'a mut type

可变引用(尚未被借用)是访问其指向的值的唯一方式,因此不是 Copy 的。

原始指针 (*const*mut)

语法
原始指针类型 :
   * ( mut | const ) 无界类型

原始指针是指不保证安全或生命周期的指针。 原始指针写为 *const T*mut T。 例如 *const i32 表示指向 32 位整数的原始指针。

复制或释放原始指针对任何其他值的生命周期没有影响。

解引用原始指针是 unsafe 操作

这也可以用来通过重新借用(&*&mut *)将原始指针转换为引用。 通常不鼓励使用原始指针;它们的存在是为了支持与外部代码的互操作性,以及编写性能关键或低级函数。

比较原始指针时,它们是按地址而不是按其指向的内容进行比较的。 当比较指向 动态大小类型 的原始指针时,也会比较它们的附加数据。

可以使用 &raw const 直接创建 *const 指针,并使用 &raw mut 创建 *mut 指针。

智能指针

标准库包含除引用和原始指针之外的其他“智能指针”类型。

位有效性

尽管在大多数平台上发出的机器代码中指针和引用类似于 usize,但将引用或指针类型转换为非指针类型的语义目前尚未确定。 因此,将指针或引用类型 P 转换为 [u8; size_of::<P>()] 可能无效。

对于瘦原始指针(即对于 P = *const TP = *mut T,其中 T: Sized),反向转换(从整数或整数数组转换为 P)始终有效。 但是,通过这种转换产生的指针可能无法解引用(即使 T 的大小为零)。