Rust中指针和引用之间的区别

帕兹

Rust中的指针*和引用&共享相同的表示形式(它们都表示一条数据的内存地址)。

编写代码时,实际的区别是什么?

将C ++代码移植到Rust时,是否可以安全地替换它们(c ++指针-> rust指针,c ++参考-> rust参考)?

弗朗西斯·加涅

可以使用引用,而必须使用指针。如果您不执行FFI或内存管理,而编译器无法验证,则不需要使用指针。

引用和指针都有两种变体。有共享引用&和可变引用&mut有const指针*const和mut指针*mut(它们映射到C语言中的const和非const指针)。但是,引用的语义与指针的语义完全不同。

引用在类型和生命周期内都是通用的。共享引用&'a T以长格式编写(其中'aT是参数)。生命周期参数在许多情况下可以省略生命周期参数由编译器用来确保引用的生存期不超过借用有效期。

指针没有生存期参数。因此,编译器无法检查特定的指针是否有效。这就是为什么要取消引用指针的原因unsafe

当创建一个共享的参照对象,即冻结对象(即对象而共享参考存在变得不可变的),除非对象使用某种形式的内部的可变性(例如,使用CellRefCellMutexRwLock)。但是,当您有一个指向对象的const指针时,在该指针处于活动状态时,该对象仍可能会更改。

当您对一个对象有可变的引用时,可以保证通过此引用可以独占访问该对象。暂时禁用任何其他访问对象的方法,或者无法实现。例如:

let mut x = 0;
{
    let y = &mut x;
    let z = &mut x; // ERROR: x is already borrowed mutably
    *y = 1; // OK
    x = 2; // ERROR: x is borrowed
}
x = 3; // OK, y went out of scope

Mut指针没有这样的保证。

引用不能为null(非常类似于C ++引用)。指针可以为空。

指针可以包含任何可能适合的数值usize初始化指针不是unsafe; 只是取消引用它。

如果有*const T,则可以将其自由转换为a*const U*mut Tusing as您不能通过引用来做到这一点。但是,您可以使用as将引用强制转换为指针,也可以通过取消引用指针(再次是unsafe),然后使用&借用该位置,来将指针“升级”至引用&mut例如:

use std::ffi::OsStr;
use std::path::Path;

pub fn os_str_to_path(s: &OsStr) -> &Path {
    unsafe { &*(s as *const OsStr as *const Path) }
}

在C ++中,引用是“自动取消引用的指针”。在Rust中,您经常仍然需要显式地取消引用。例外是使用.运算符时:如果左侧是引用,则编译器将自动对其取消引用(必要时递归!)。但是,指针不会自动取消引用。这意味着如果要取消引用并访问字段或方法,则需要编写(*pointer).field(*pointer).method()->Rust中没有运算符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Vala中原始指针和弱引用之间的区别?

来自分类Dev

引用类型和引用之间的区别

来自分类Dev

引用和指针之间的区别

来自分类Dev

当它们访问C中的指针的值时,间接引用和取消引用之间是否有任何区别?

来自分类Dev

Clojure-引用和语法引用之间的区别

来自分类Dev

Gemfile:github参考中的分支和引用之间的区别

来自分类Dev

Java中传递接口引用和类引用之间的区别

来自分类Dev

取消引用指针和访问数组元素之间的区别

来自分类Dev

C++ 中的指针和引用之间是否有任何开销差异

来自分类Dev

C ++中的变量和引用之间有什么区别?

来自分类Dev

双冒号的使用-静态和非静态方法引用之间的区别

来自分类Dev

Linux“实用程序”,“命令”和“程序”的引用之间的区别

来自分类Dev

ISR和函数调用之间的区别?

来自分类Dev

Typedef函数指针-使用与不使用之间的区别

来自分类Dev

C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别

来自分类Dev

特定场景中指针解引用和强制转换之间的关系不明确

来自分类Dev

Perl中用于捕获的括号与反向引用之间的区别

来自分类Dev

双指针和指针数组之间的区别

来自分类Dev

带有轻量用户数据的Lua注册表和引用之间有什么区别?

来自分类Dev

使用指针和ref关键字引用值之间有什么区别

来自分类Dev

线程隔离和信号隔离调用之间的区别

来自分类Dev

使用之间的区别?和:param在prepare语句中

来自分类Dev

数据框列的套用和套用之间的区别?

来自分类Dev

镜头的观看和使用之间有什么区别?

来自分类Dev

慢系统调用和快速系统调用之间的区别

来自分类Dev

在C#中使用和.Dispose()调用之间的区别

来自分类Dev

打印输出指针与取消引用指针之间的区别

来自分类Dev

在Rust中使用引用和使用拥有值之间有区别吗?

来自分类Dev

C ++如何处理函数中指针和引用的更改?

Related 相关文章

  1. 1

    Vala中原始指针和弱引用之间的区别?

  2. 2

    引用类型和引用之间的区别

  3. 3

    引用和指针之间的区别

  4. 4

    当它们访问C中的指针的值时,间接引用和取消引用之间是否有任何区别?

  5. 5

    Clojure-引用和语法引用之间的区别

  6. 6

    Gemfile:github参考中的分支和引用之间的区别

  7. 7

    Java中传递接口引用和类引用之间的区别

  8. 8

    取消引用指针和访问数组元素之间的区别

  9. 9

    C++ 中的指针和引用之间是否有任何开销差异

  10. 10

    C ++中的变量和引用之间有什么区别?

  11. 11

    双冒号的使用-静态和非静态方法引用之间的区别

  12. 12

    Linux“实用程序”,“命令”和“程序”的引用之间的区别

  13. 13

    ISR和函数调用之间的区别?

  14. 14

    Typedef函数指针-使用与不使用之间的区别

  15. 15

    C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别

  16. 16

    特定场景中指针解引用和强制转换之间的关系不明确

  17. 17

    Perl中用于捕获的括号与反向引用之间的区别

  18. 18

    双指针和指针数组之间的区别

  19. 19

    带有轻量用户数据的Lua注册表和引用之间有什么区别?

  20. 20

    使用指针和ref关键字引用值之间有什么区别

  21. 21

    线程隔离和信号隔离调用之间的区别

  22. 22

    使用之间的区别?和:param在prepare语句中

  23. 23

    数据框列的套用和套用之间的区别?

  24. 24

    镜头的观看和使用之间有什么区别?

  25. 25

    慢系统调用和快速系统调用之间的区别

  26. 26

    在C#中使用和.Dispose()调用之间的区别

  27. 27

    打印输出指针与取消引用指针之间的区别

  28. 28

    在Rust中使用引用和使用拥有值之间有区别吗?

  29. 29

    C ++如何处理函数中指针和引用的更改?

热门标签

归档