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

1、定义原始指针

我们可以通过以下方法定义原始指针:


fn main() {let mut num = 5;let r1 = &num as *const i32;let r2 = &mut num as *mut i32;}

通过&num获取的是Rust的不可修改(immutable)指针,然后通过as进行强制转换,转换为*const i32,表示不可修改(immutable)的i32类型的原始指针。

通过&mut 获取的是Rust的可修改(mutable)指针,然后通过as进行强制转换,转换为*mut i32,表示可修改(immutable)的i32类型的原始指针。

注意这里的*不是单独的操作符,而是应该把*const连起来看成是一个类型,同理*mut也是连起来作为单独的一个类型。

下面尝试对通过*const类型的指针进行内容修改:

fn main() {let mut num = 5;let r1 = &num as *const i32;let r2 = &mut num as *mut i32;unsafe {*r1 = 1;}
}

编译后会发现报错:

error[E0594]: cannot assign to `*r1`, which is behind a `*const` pointer--> src/main.rs:9:10   |
6 |     let r1 = &num as *const i32;|              ---- help: consider changing this to be a mutable pointer: `&mut num`
...
9 |          *r1 = 1;|          ^^^^^^^ `r1` is a `*const` pointer, so the data it refers to cannot be written

这里编译器告诉我们,r1是个*const类型的原始指针,因此它指向的数据是不可以被修改的。

下面尝试使用可修改的原始指针进行数据修改:

fn main() {let mut num = 5;let r1 = &num as *const i32;let r2 = &mut num as *mut i32;unsafe {*r2 = 1;}println!("num={:?}",num);
}

结果为

num=1

修改成功,说明*mut类型的原始指针是可以修改数据的。

2、获取原始指针指向的数据

我们可以通过操作符 * 来获取原始指针指向的数据:

fn main() {let mut num = 5;let r1 = &num as *const i32;let r2 = &mut num as *mut i32;unsafe {println!("r1 is: {}", *r1);println!("r2 is: {}", *r2);}
}

运行结果如下:

r1 is: 5
r2 is: 5

这里需要注意的是,定义原始指针可以直接在Rust语句中定义,获取原始指针指向的数据则需要在unsafe代码块中使用,否则编译会报错。

Rust简短笔记:原始指针(Raw Pointer)相关推荐

  1. Rust 学习笔记——智能指针

    https://doc.rust-lang.org/book/ch15-00-smart-pointers.html 智能指针是一种想指针一样的行为且具有其他能力的数据结构(Smart pointer ...

  2. 【软件分析/静态程序分析学习笔记】7.指针分析(Pointer Analysis)入门

    写在前面的话 本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知 ...

  3. C++核心准则R.2: 只在接口中表示单独对象使用原始指针​

    R.2: In interfaces, use raw pointers to denote individual objects (only) R.2: 只在接口中表示单独对象使用原始指针 Reas ...

  4. [C++] 什么是智能指针(Smart Pointer)以及何时使用

    答案 1 智能指针是一个类,它封装了一个原始的C++指针,以管理所指对象的生命期.没有单一的智能指针类型,但所有这些都尝试以实用的方式抽象原始指针. 智能指针应优先于原始指针. 如果你觉得你需要使用指 ...

  5. C和C++安全编码笔记:指针诡计

    指针诡计(pointer subterfuge)是通过修改指针值来利用程序漏洞的方法的统称. 可以通过覆盖函数指针将程序的控制权转移到攻击者提供的外壳代码(shellcode).当程序通过函数指针执行 ...

  6. boost::python模块实现使用原始指针访问数据的示例

    boost::python模块实现使用原始指针访问数据的示例 实现功能 C++实现代码 实现功能 boost::python模块实现使用原始指针访问数据的示例 C++实现代码 #include < ...

  7. 【C++】智能指针 Smart Pointer

    智能指针 智能指针 Smart Pointer auto_ptr 智能指针的自实现 shared_ptr weak_ptr unique_ptr 智能指针 Smart Pointer 用来改善传统指针 ...

  8. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  9. Boost学习笔记-智能指针

    1.  智能指针 scoped_ptr 只在作用域内生效,离开作用域既释放资源,不能复制和赋值.类似于标准库的auto_ptr,但它相对于auto_ptr的优势在于,他的要求更严格,使用起来更安全.a ...

最新文章

  1. EvalAI使用——类似kaggle的开源平台,不过没有kernel fork功能,比较蛋疼
  2. c# 经验谈:巧用Expression表达式 解决类似于sql中 select in 的查询(适合于中小型项目)...
  3. 如何读取超大文本文件
  4. rac_安装软件时报版本号过高问题
  5. 剑指offer(刷题51-60)--c++,Python版本
  6. 博士导师总结目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)
  7. 4-4Pytorch解决数字识别MNIST
  8. 如何使用IIS重写模块将HTTP重定向到HTTPS
  9. aix查看文件夹大小命令_轻松掌握 Linux 命令(1):ls 命令
  10. 一步一个脚印学习WCF系列之WCF概要—WCF与SOA(二)
  11. java 反复器_java集合类中的枚举器(反复器)
  12. 3x3矩阵怎么求逆矩阵_表象变换的幺正算符怎么定义的? 为何说算符与态可以看作矩阵?...
  13. OrCAD设计原理图
  14. 还在花钱买课呢?教你白嫖开放注册图书馆价值上万元的学习资源
  15. 深度强化学习算法 A3C (Actor-Critic Algorithm)
  16. MotorSolve(电机设计软件)v5.1绿色中文版
  17. Chinese-Whisper聚类算法
  18. 通道和色彩调整——冷色调图片
  19. mac的mysql关机后打不开了_mysql for mac服务无法启动
  20. C语言每日一练——第73天:谁是窃贼问题

热门文章

  1. ERP管理 | 实现企业资金流、信息流和物流一体化的快速发展
  2. 生命不息,折腾不止~Vim编辑器,插件,编译,补全配置(2018)
  3. 2022-2027年中国互联网+香水行业市场全景评估及发展战略规划报告
  4. 最全中国科学技术大学计算机学院课程资源!
  5. 编写shell脚本判断当前主机的CPU生产商
  6. 机器学习和特征工程理论与python代码实现 晓物智联
  7. FPGA Verilog md5算法实现源代码及仿真文件分享。
  8. 《Python编程:从入门到实践》答案
  9. 字、字节、字长、存储单元、bit、byte的关系
  10. matlab读csv文件