• Rust星号(*)的作用-基础篇


    Rust中,*符号具有多种不同的用途,具体取决于它的使用方式。以下是Rust中*常见的用法.

    1.解引用指针

    当作为一元运算符放在指针变量之前时,*用于解引用指针并访问它指向的值。在Rust中,通常更推荐使用引用而不是原始指针。引用提供了更多的安全性和可读性。解引用引用时,不需要使用 *,因为 Rust 自动处理引用的解引用。例如:

    fn main() {
        let x = 42;
        let ptr = &x;
        let value = *ptr; // 解引用指针
        println!("{}", value);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这个示例中,*ptr从指针指向的内存位置检索值42

    2.类型注解

    在函数签名和类型注解中,*用于表示原始指针类型。例如:

    fn process_data(data: *const i32) {
        // 函数接受一个指向i32的原始指针
    }
    
    • 1
    • 2
    • 3

    在这里,*const i32表示对不可变的原始指针类型。

    3. 创建原始(raw)指针

    在表达式中作为&的右侧使用*,用于从引用创建原始指针。和引用一样,原始指针是不可变或可变的,分别写作 *const T*mut T

    fn main() {
        let x = 42;
        let ptr: *const i32 = &x; // 从引用创建原始指针
        let mut y = 42;
        let ptr1: *mut i32 = &mut y;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在Rust中,您不能直接将不可变引用(&)赋值给可变指针(*mut)或将可变引用赋值给不可变指针(*const)。这是因为可变指针允许对数据进行可变修改,而不可变引用要求数据是不可变的,这两者之间存在不兼容性。

    请注意,使用可变指针需要放在 unsafe 块内,并且需要格外小心,以确保不会导致不安全性问题。

    引用解引用 (&T&mut T)

    在Rust中,通常更推荐使用引用而不是原始指针。引用提供了更多的安全性和可读性。解引用引用时,不需要使用 *,因为 Rust 自动处理引用的解引用。

    fn main() {
        let mut x = 42;
    
        let reference = &x; // 创建不可变引用
    
        // 不需要使用 * 解引用引用
        println!("Value: {}", reference);
    
        let mutable_reference = &mut x; // 创建可变引用
    
        // 不需要使用 * 解引用引用
        *mutable_reference = 100; // 修改值
    
        println!("Value: {}", x); // 打印修改后的值
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.乘法运算符

    在算术表达式中,*用作乘法运算符。例如:

    let result = 3 * 4; // 将3和4相乘
    
    • 1

    在大部分语言中都是作为乘法运算符

    5. 通配符导入

    在模块声明中,*可用于通配符导入,以从模块中导入所有项目。Java语言中也是可以用于通配符。例如

    mod my_module {
        pub fn function1() {}
        pub fn function2() {}
    }
    
    use my_module::*; // 从my_module导入所有项目
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这种情况下,*用于导入所有项目(在这个示例中是函数)从my_module模块中。*的含义取决于它在代码中的上下文,因此在Rust代码中使用时需要注意它的用法。

    我是蚂蚁背大象,文章对你有帮助给项目点个❤关注我GitHub:mxsm,文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsm@apache.com

  • 相关阅读:
    LVS+DR部署
    Java项目防止SQL注入的四种方案
    单机运行多个独立浏览器
    面向对象、方法重写、重载(overload)与重写(override)的区别、super关键字、构造方法的特殊性
    在springboot中实现WebSocket协议通信
    FFmpeg转码参数说明及视频转码示例
    C语言实现冒泡排序、选择排序、快速排序
    企业邮箱“成员收发权限”功能详解【如何开通企业邮箱】
    Nacos和Eureka有什么区别!!!
    APP自动化测试-10.Appium中Desired Capabilities常用参数
  • 原文地址:https://blog.csdn.net/ljbmxsm/article/details/133883470