指针类型
所有指针都是显式的第一类值。它们可以被移动或复制,存储到数据结构中,并从函数中返回。
引用 (& 和 &mut)
共享引用 (&)
共享引用指向由其他值拥有的内存。
当创建对一个值的共享引用时,它会阻止对该值的直接修改。内部可变性在某些情况下提供了例外。顾名思义,对一个值可以存在任意数量的共享引用。共享引用类型写作 &type,或者在需要指定显式生命周期时写作 &'a type。
复制引用是“浅”操作:它只涉及复制指针本身,也就是说,指针是 Copy 类型。释放引用对其指向的值没有影响,但引用 临时值 会使其在引用的作用域内保持存活。
可变引用 (&mut)
可变引用指向由其他值拥有的内存。可变引用类型写作 &mut type 或 &'a mut type。
可变引用(未被借用)是访问其指向的值的唯一方式,因此它不是 Copy 类型。
裸指针 (*const 和 *mut)
语法
RawPointerType :
*(mut|const) 无边界类型
裸指针是不带安全或存活性保证的指针。裸指针写作 *const T 或 *mut T。例如,*const i32 表示指向一个 32 位整数的裸指针。
复制或丢弃裸指针对任何其他值的生命周期没有影响。
解引用裸指针是 unsafe 操作。
这也可以通过重新借用(&* 或 &mut *)将裸指针转换为引用。通常不鼓励使用裸指针;它们的存在是为了支持与外部代码的互操作,以及编写性能关键或低层函数。
比较裸指针时,是按它们的地址进行比较,而不是按它们指向的内容。比较裸指针和 动态大小类型 时,它们的附加数据也会被比较。
裸指针可以直接使用 &raw const 创建 *const 指针,使用 &raw mut 创建 *mut 指针。
智能指针
标准库包含引用和裸指针之外的更多‘智能指针’类型。
位有效性
尽管在大多数平台发出的机器码中,指针和引用类似于 usize,但将引用或指针类型转换为非指针类型的语义目前尚未确定。因此,将指针或引用类型 P 转换为 [u8; size_of::<P>()] 可能不是有效的。
对于瘦裸指针(即对于 T: Sized 的 P = *const T 或 P = *mut T),反向转换(从整数或整数数组转换为 P)始终是有效的。然而,通过这种转换产生的指针可能无法被解引用(即使 T 的大小为零也不行)。