Rust:指针 `*T` 和引用 `&T`的区别

在 Rust 编程语言中,*T 和 &T 是两种不同类型的指针,它们各自代表了不同的内存访问方式和所有权模型。

  1. *T(原始指针或裸指针):

    • *T 是一个原始指针(也称为裸指针或裸引用),它可以指向任意类型 T 的数据。
    • 原始指针不进行任何安全性检查,也不会进行借用检查或生命周期管理。这意味着它们可以指向任意内存地址,包括悬空指针(dangling pointer)、野指针(wild pointer)或未初始化的内存。
    • 由于原始指针的不安全性,它们通常只在需要直接与操作系统交互、实现底层数据结构或进行性能优化时才使用。在大多数情况下,建议使用安全的引用类型 &T 和可变引用 &mut T。
    • 原始指针可以是空(null),但在 Rust 中更常见的做法是使用 Option<*const T> 或 Option<*mut T> 来表示可能为空的指针,以避免空指针解引用的风险。
  2. &T(不可变引用):

    • &T 是一个不可变引用,它指向类型 T 的数据,但不允许修改该数据。
    • 不可变引用是 Rust 内存安全性的基石之一。它们通过借用检查(borrow checking)机制来确保同时只有一个可变引用或多个不可变引用可以访问同一块数据,从而防止数据竞争和悬挂指针等问题。
    • 不可变引用在 Rust 中非常常见,用于在函数之间传递数据而不改变其值。
    • 不可变引用的生命周期由 Rust 编译器自动管理,确保它们不会超出其引用的数据的生命周期。

总结来说,*T 是一个原始、不安全的指针类型,而 &T 是一个安全、受 Rust 借用检查保护的不可变引用类型。在编写 Rust 代码时,应优先考虑使用安全的引用类型 &T 和 &mut T,只有在确实需要时才使用原始指针 *T,并始终注意确保内存安全性和避免潜在的未定义行为。

相关推荐
D e re k ZH25 分钟前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
小Z先生36 分钟前
我用 Go + 系统 WebView 写了个纯本地 Postman:不装 Electron、不连云端
后端·github
IT_陈寒1 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
灿飞屋1 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
石小石Orz1 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
陈随易2 小时前
专注飞机 FocusFlight,两个人把番茄钟做成了一趟航班
前端·后端·程序员
量化分析码农2 小时前
【Python量化波动率实战 04】低波动异象:低波组真的跑赢高波组吗
后端
风上猫2 小时前
MySQL多值索引:让 JSON 数组也能走索引(以及 6 个容易踩的坑)
后端
总要学点什么2 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质