对于Rust而言,指针就是包含某个值(value)的地址的值。
第一、要有指向,即value
第二、本身也有值,但其值是特殊的值,类似于0x26b315f794的内存地址值。

别看很简单,但Rust还用法很多,功能很强大。

本内容部分有引用《Rust essentials》部分,特此说明。

1、pointer
更多的是borrowed pointer 。

    let mut mynum = 5.0_f32;//valuelet mut temp = &mynum;  // a pointer//let mut temp = &mut mynum;  // a pointer is ok!let sqrtnum = (*temp).sqrt();//真实的情况//let sqrtnum = temp.sqrt();//当然也是可以这样的println!("sqrt :{}", sqrtnum);println!("temp address {:p}",temp);//0x26b315f794

2、ref

等同于&

let ref temp2 = &mynum;
println!("temp2 address :{:p}", temp2);  //0xf57696f8b0let mut num = 6.0_f32;
let ref mut temp3 = &mut num;
println!("temp3 address :{:p}", temp3); //0xcc6152f330
    let s: String = "abc".to_string();let ref refs = &s;let rf = &s;//assert_eq!(rf, refs);println!("refs:   {:p}", refs);println!("&   :   {:p}", rf);

output:

refs:   0x424d1ff820
&   :   0x424d1ff800

这个经常也和match 搭配,这里就不详细描述了。

3、Box
当你想写一个函数,其返回值是一个函数时侯,Box是一个很好伙伴。他小心地帮你包装好,你不需要操太多心。

    let mut bx = Box::new(42);println!("bx  before :{:?}", bx);  //42*bx = 43; //bx 必须有mutprintln!("bx  after  :{:?}", bx);  //43let mut bx_1 = &*bx;println!("bx_1 :{:?}", bx_1);     //43

4、as_ptr()

    let mut strs = "hello".to_string();for _ in 0..10 {println!("address :{:?} capacity:{:?} ,len:{:?}",strs.as_ptr(),strs.capacity(),strs.len());strs.push_str("!");}println!("push ended!");println!("address :{:?} capacity:{:?} ,len:{:?}",strs.as_ptr(),strs.capacity(),strs.len());

output:

address :0x23841297950 capacity:5 ,len:5
address :0x23841297950 capacity:10 ,len:6
address :0x23841297950 capacity:10 ,len:7
address :0x23841297950 capacity:10 ,len:8
address :0x23841297950 capacity:10 ,len:9
address :0x23841297950 capacity:10 ,len:10
address :0x23841294cb0 capacity:20 ,len:11
address :0x23841294cb0 capacity:20 ,len:12
address :0x23841294cb0 capacity:20 ,len:13
address :0x23841294cb0 capacity:20 ,len:14
push ended!
address :0x23841294cb0 capacity:20 ,len:15

5、&trait

6、rc : 引用计数
如果你对一个不变值的对象,需要多次引用,且在一个线程中,rc可能能帮上你的忙,这个时侯,你只需要在值后面加一个clone().

7、Cell,RefCell

8、Arc

9、&[T]->&[U]

10、raw pointer: *const T, and *mut T

11、borrow()

use std::cell::{RefCell, Ref};
let c = RefCell::new((5, 'b'));
let b1: Ref<(u32, char)> = c.borrow();
let b2: Ref<u32> = Ref::map(b1, |t| &t.0);
assert_eq!(*b2, 5)

Rust : Pointer......to be continued相关推荐

  1. Inter-process communication in a safe kernel论文翻译

    Inter-process communication in a safe kernel 摘要: 传统的操作系统遵循单片设计,在共享地址空间中执行所有内核子系统,从而以牺牲隔离和安全为代价获得良好的性 ...

  2. Rust简短笔记:原始指针(Raw Pointer)

    众所周知,Rust语言的指针是一种安全的指针,它会遵循一定的规则,比如ownership规则,会确保不出现悬挂指针.但是当我们需要写一些底层框架的时候,往往需要绕过这些规则,自由的控制指针,这时候我们 ...

  3. [译] 论 Rust 和 WebAssembly 对源码地址索引的极限优化

    原文地址:Oxidizing Source Maps with Rust and WebAssembly 原文作者:Nick Fitzgerald 译文出自:掘金翻译计划 本文永久链接:github. ...

  4. C++和Rust_C 还是 Rust:选择哪个用于硬件抽象编程 | Linux 中国

    在 Rust 中使用类型级编程可以使硬件抽象更加安全.-- Dan Pittman Rust 是一种日益流行的编程语言,被视为硬件接口的最佳选择.通常会将其与 C 的抽象级别相比较.本文介绍了 Rus ...

  5. Rust编程语言的核心部件

    Rust是一门强调安全.并发.高效的系统编程语言.无GC实现内存安全机制.无数据竞争的并发机制.无运行时开销的抽象机制,是Rust独特的优越特性.它声称解决了传统C语言和C++语言几十年来饱受责难的内 ...

  6. java 释放指针_C库释放来自Rust的指针

    我想对需要回调的C库执行Rust绑定,并且此回调必须返回一个C风格的 char* 指向C库的指针,然后释放它 . 回调必须在某种意义上暴露给我的库的用户(可能使用闭包),并且我想尽可能方便地提供Rus ...

  7. 连续 3 年最受欢迎:Rust,香!

    简介:我们在选择一种开发语言时会综合考量各方面的特性,根据实际的需求适当取舍.鱼和熊掌往往不可兼得,要想开发效率高,必然要牺牲性能和资源消耗,反之亦然.但是Rust却出其不意,令人眼前一亮!本文将从性 ...

  8. 从C++转向最受欢迎的Rust语言

    作者:孟杰,腾讯 TEG后台开发工程师 在日常开发过程中,若长期使用C++语言,在初次使用Rust的过程中可能会碰到一些问题.本文尝试从C++的角度来说明在使用Rust时需要特别注意的一些地方,特别是 ...

  9. 怎么new一个指针_【译】Rust与智能指针

    原文链接:https://dev.to/imaculate3/that-s-so-rusty-smart-pointers-245l 原文标题:That's so Rusty!: Smart poin ...

  10. 取两个数较小值c语言_如何提升C语言安全性,达到RUST的安全性

    可信C语言:让C语言达到和RUST一样的安全性 1. 所有权 所有运行的程序都必须管理其使用计算机内存的方式.一些语言中具有GC(Garbage Collection)机制,在程序运行时不断地寻找不再 ...

最新文章

  1. [JDBC技术]3.JDBC数据库连接池实例
  2. 制作一个表格,显示班级的学生信息。
  3. Cocos2d—android 中常用的工具类
  4. C#排队处理DEMO
  5. Knowledge Graph Alignment Network with Gated Multi-Hop Neighborhood Aggregation-学习笔记
  6. python自学网站需要多长时间-怎么自学python,大概要多久?
  7. 多行书写的字符串字面值
  8. xml获取配置DataTable
  9. [交叉验证]机器学习中分类器的选择
  10. 二叉树进阶之平衡二叉树的判断
  11. 在本地电脑搭建一个网站 转自本文地址:http://www.fengzimo.com/1503.html 来源 疯子墨...
  12. 互联网原创表情论坛举行 探索设计师盈利新生态
  13. python游戏辅助lol_GitHub - skyedai910/lol-skin-spider: 30行Python代码爬取英雄联盟全英雄全皮肤...
  14. 当yum安装包时显示系统空间不足,求指教
  15. 128根号e980计算机怎么打,我能想到最浪漫的事,就是鼓起勇气给了你一张纸条,上面写着:128根号e980...
  16. 干货分搞私投以技术面试
  17. 3-10 统计输入字符串中的单词个数及单词的平均长度(高教社,《Python编程基础及应用》习题7-7)
  18. 设计模式:建造模式(组装电脑)
  19. Mysql数据库的分离和附加
  20. Visual FoxPro 6.0常用命令

热门文章

  1. 部署万兆以太网的十个注意事项
  2. LuoguP3045牛券Cow Coupons
  3. linux网络防火墙-iptables基础详解
  4. JAVA基础知识总结2(语法基础)
  5. Python安装学习
  6. 新增四则运算用户选择功能小程序
  7. linux后台运行程序(secureCRT断掉或关闭后继续运行程序)
  8. V-rep学习笔记:机器人逆运动学数值解法(The Jacobian Transpose Method)
  9. 190703每日一句
  10. MATLAB调用OpenCV流程(MATLAB R2016a+OpenCV3.1.0+VS2010