文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Rust语言中级教程之指针

2023-05-19 05:28

关注

Rust语言中级教程

一、指针

什么是指针

名词解释

Rust 的引用

Rust 的引用 和 指针

static B: [u8; 10] = [99, 97, 114, 114, 121, 116, 111, 119, 101, 108];
static C: [u8; 11] = [116, 104, 97, 110, 107, 115, 102, 105, 115, 104, 0];
fn main() {
    let a = 42;
    let b = &B;
    let c = &C;
    println!("a: {}, b: {:p}, c: {:p}", a, b, c);
}

运行

point_demo on  master [?] is ? 0.1.0 via ? 1.67.1 via ? base 
➜ cargo run           
   Compiling point_demo v0.1.0 (/Users/qiaopengjun/rust/point_demo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.44s
     Running `target/debug/point_demo`
a: 42, b: 0x1023dc660, c: 0x1023dc66a

point_demo on  master [?] is ? 0.1.0 via ? 1.67.1 via ? base 
➜ 

use std::mem::size_of;
static B: [u8; 10] = [99, 97, 114, 114, 121, 116, 111, 119, 101, 108];
static C: [u8; 11] = [116, 104, 97, 110, 107, 115, 102, 105, 115, 104, 0];
fn main() {
    // let a = 42;
    // let b = &B;
    // let c = &C;
    // println!("a: {}, b: {:p}, c: {:p}", a, b, c);
    let a: usize = 42;
    let b: Box<[u8]> = Box::new(B);
    let c: &[u8; 11] = &C;
    println!("a (unsigned 整数):");
    println!("  地址: {:p}", &a);
    println!("  大小:    {:?} bytes", size_of::<usize>());
    println!("  值:  {:?}\n", a);
    println!("b (B 装在 Box 里):");
    println!("  地址:  {:p}", &b);
    println!("  大小:    {:?} bytes", size_of::<Box<[u8]>>());
    println!("  指向:  {:p}\n", b);
    println!("c (C 的引用):");
    println!("  地址:  {:p}", &c);
    println!("  大小:  {:?} bytes", size_of::<&[u8; 11]>());
    println!("  指向:  {:p}\n", c);
    println!("B (10 bytes 的数组):");
    println!("  地址:  {:p}", &B);
    println!("  大小:  {:?} bytes", size_of::<[u8; 10]>());
    println!("  值:  {:?}\n", B);
    println!("C (11 bytes 的数字):");
    println!("  地址:  {:p}", &C);
    println!("  大小:  {:?} bytes", size_of::<[u8; 11]>());
    println!("  值:  {:?}\n", C);
}

运行

point_demo on  master [?] is ? 0.1.0 via ? 1.67.1 via ? base 
➜ cargo run
   Compiling point_demo v0.1.0 (/Users/qiaopengjun/rust/point_demo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.19s
     Running `target/debug/point_demo`
a (unsigned 整数):
  地址: 0x16dda9a08
  大小:    8 bytes
  值:  42

b (B 装在 Box 里):
  地址:  0x16dda9a10
  大小:    16 bytes
  指向:  0x12b606ba0

c (C 的引用):
  地址:  0x16dda9a30
  大小:  8 bytes
  指向:  0x10208d7ba

B (10 bytes 的数组):
  地址:  0x10208d7b0
  大小:  10 bytes
  值:  [99, 97, 114, 114, 121, 116, 111, 119, 101, 108]

C (11 bytes 的数字):
  地址:  0x10208d7ba
  大小:  11 bytes
  值:  [116, 104, 97, 110, 107, 115, 102, 105, 115, 104, 0]

point_demo on  master [?] is ? 0.1.0 via ? 1.67.1 via ? base 
➜ 

use std::borrow::Cow;
use std::ffi::CStr;
use std::os::raw::c_char;
static B: [u8; 10] = [99, 97, 114, 114, 121, 116, 111, 119, 101, 108];
static C: [u8; 11] = [116, 104, 97, 110, 107, 115, 102, 105, 115, 104, 0];
fn main() {
  let a = 42;
  let b: String;
  let c: Cow<str>;
  unsafe {
    let b_ptr = &B as * const u8 as *mut u8;
    b = String::from_raw_parts(b_ptr, 10, 10);
    let c_ptr = &C as *const u8 as *const c_char;
    c = CStr::from_ptr(c_ptr).to_string_lossy();
  }
  println!("a: {}, b: {}, c: {}", a, b, c);
}

Raw Pointers(原始指针)

fn main() {
  let a: i64 = 42;
  let a_ptr = &a as *const i64;
  println!("a: {} ({:p})", a, a_ptr);
}
fn main() {
  let a: i64 = 42;
  let a_ptr = &a as *const i64;
  let a_addr: usize = unsafe {std::mem::transmute(a_ptr)};
  println!("a: {} ({:p}...0x{:x})", a, a_ptr, a_addr + 7);
}

关于 Raw Pointer 的提醒

使用 Raw Pointer 的情况

Rust 指针生态

Rust 智能指针

名称简介强项弱项
Raw Pointer*mut T 和 *const T,自由基,闪电般块,极其 Unsafe速度、与外界交互Unsafe
Box<T>可把任何东西都放在Box里。可接受几乎任何类型的长期存储。新的安全编程时代的主力军。将值集中存储在 Heap大小增加
Rc<T>是Rust的能干而吝啬的簿记员。它知道谁借了什么,何时借了什么对值的共享访问大小增加;运行时成本;线程不安全
Arc<T>是Rust的大使。它可以跨线程共享值,保证这些值不会相互干扰对值的共享访问;线程安全大小增加;运行时成本
Cell<T>变态专家,具有改变不可变值的能力内部可变性大小增加;性能
RefCell<T>对不可变引用执行改变,但有代价内部可变性;可与仅接受不可变引用的Rc、Arc嵌套使用大小增加;运行时成本;缺乏编译时保障
Cow<T>封闭并提供对借用数据的不可变访问,并在需要修改或所有权时延迟克隆数据当只是只读访问时避免写入大小可能会增大
String可处理可变长度的文本,展示了如何构建安全的抽象动态按需增长;在运行时保证正确编码过度分配内存大小
Vec<T>程序最常用的存储系统;它在创建和销毁值时保持数据有序动态按需增长过度分配内存大小
RawVec<T>Vec<T>和其它动态大小类型的基石;知道如何按需给你的数据提供一个家动态按需增长;与内存分配器一起配合寻找空间不直接适用于您的代码
Unique<T>作为值的唯一所有者,可保证拥有完全控制权需要独占值的类型(如 String)的基础不适合直接用于应用程序代码
Shared<T>分享所有权很难,但他使生活更轻松共享所有权;可以将内存与T的宽度对齐,即使是空的时候不适合直接用于应用程序代码

到此这篇关于Rust语言中级教程之指针的文章就介绍到这了,更多相关Rust指针内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯