Rust:引用和指针有什么区别?

在 Rust 中,指针和引用都可以用来指向内存中的某个值。它们之间的主要区别在于它们的安全性和生命周期保证。

  • 引用(Reference):引用是 Rust 中的一种安全指针。它们通过借用检查器来保证安全性,确保在引用的整个生命周期内,它所指向的值都是有效的。引用分为共享引用(&T)和可变引用(&mut T)。共享引用允许多个引用同时指向同一个值,但不允许修改该值;可变引用只允许一个引用指向某个值,并且允许修改该值。
  • 指针(Pointer):指针是 Rust 中的一种不安全指针。它们没有生命周期保证,也不受借用检查器的保护。指针分为常量指针(*const T)和可变指针(*mut T)。常量指针和可变指针都可以指向任意内存地址,但解引用它们是不安全的操作,需要在 unsafe 块中进行。

下面是一个简单的 Rust 代码示例,演示了如何使用引用和指针:

rust 复制代码
fn main() {
    let mut x = 10;
    let r1 = &x; // 创建一个共享引用
    let r2 = &x; // 创建另一个共享引用
    println!("r1 = {}, r2 = {}", r1, r2);

    let r3 = &mut x; // 创建一个可变引用
    *r3 += 1; // 通过可变引用修改 x 的值
    println!("x = {}", x);

    let p1: *const i32 = &x as *const i32; // 创建一个常量指针
    let p2: *mut i32 = &mut x as *mut i32; // 创建一个可变指针

    unsafe {
        // 解引用指针需要在 unsafe 块中进行
        println!("*p1 = {}", *p1);
        *p2 += 1;
        println!("x = {}", x);
    }
}

在这个示例中,我们定义了一个可变整数变量 x,并创建了两个共享引用 r1r2 指向它。然后我们创建了一个可变引用 r3 指向 x,并通过它修改了 x 的值。

接下来,我们创建了两个指针 p1p2 分别指向 x 的地址。由于解引用指针是不安全的操作,所以我们需要在 unsafe 块中进行。

并且这个例子中有趣的是,r1和p1都指向x栈上的地址,所以看起来,在同一时刻,x的可变引用和不可变引用是同时存在的,跟我们学过的,在rust中不可同时存在可变引用和不可变引用有点相背,看来万事不绝对,在一些情况下,使用unsafe可以做到这些奇奇怪怪的事情。但是一般情况下,我们不会想在rust中使用指针,因为他不会被借用检查器检查,有可能会出现空指针的情况。from刘金,转载请注明原文链接。感谢!

相关推荐
特立独行的猫a29 分钟前
Tauri v2的Rust应用 → HarmonyOS(鸿蒙 PC)移植30分钟速成指南
开发语言·rust·harmonyos·tauri·移植·鸿蒙pc
程序员爱钓鱼43 分钟前
Rust 方法 Method详解:self、方法调用与API设计
后端·面试·rust
Patrick_Wilson16 小时前
sccache 用在 Rust 上为什么常「不省编译」:原理、限制与 Windows 接入
ci/cd·rust·编译器
k4m7v2pz1 天前
rvs 26.8.43 → 26.8.53 更新概览:MCP 落地、审计增强与谬误澄清
rust·repl·mcp server·rust-verb-shell·rvs·shell 工具
程序员爱钓鱼1 天前
Rust impl详解:为Struct定义方法与关联函数
前端·后端·rust
k4m7v2pz1 天前
Rust 程序在 ReactOS 上“加载即崩“:从崩溃地址 0x6107104d 到 CRT 依赖的深度排查
rust·交叉编译·逆向工程·reactos·pe格式·windows兼容
Thneonl2 天前
一个人从 Rust 内核做到 React 前端:我做了一个云原生 SRE 巡检图谱桌面工具
rust
程序员爱钓鱼2 天前
Rust Struct结构体详解:定义自己的复杂数据类型
后端·面试·rust
苏灿烤鱼2 天前
公司**不可计算,就自己做操作系统
rust·typescript·agent
nnerddboy2 天前
Rust教程04:引用、借用与切片
开发语言·后端·rust