指针类型

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

引用 (&&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 *)将原始指针转换为引用。通常不鼓励使用原始指针;它们的存在是为了支持与外部代码的互操作性,以及编写性能至关重要或底层的函数。

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

可以使用 core::ptr::addr_of!*const 指针和 core::ptr::addr_of_mut!*mut 指针直接创建原始指针。

智能指针

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

位有效性

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

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