【Rust中级教程】1.1. 指针概览(上):什么是指针、指针和引用的区别
1.1 指针概览(上)什么是指针、指针和引用的区别1.1.1. 什么是指针指针是计算机引用无法立即直接访问的数据的一种方式。一个非常形象的类比就是书的目录目录相当于指针目录里面存的是对应内容所在的页码在计算机中指针存的是一个地址。在书里面我们通过目录的页码就可以找到具体的内容在计算机里我们通过指针里存的地址来找到我们想要访问的数据。下图是对指针一个形象的描述图数据在物理内存中(Random Access Memory简称RAM)是分散着存储的。而为了找到具体的数据我们需要一个检索系统叫做地址空间。指针会被编码为内存地址使用usize类型使用usize的原因在讲虚拟内存时会讲的整数表示。一个地址会指向地址空间中的某个地方。地址空间的范围是系统和CPU提供的外观界面facade指个系统或组件对外呈现的简化界面隐藏了复杂的内部细节。程序只知道有序的字节序列并不会考虑系统中实际RAM的数量。1.1.2. 名词解释内存地址又叫地址内存中指代单个字节的一个数。内存地址是汇编语言提供的抽象。指针又叫原始指针指向某种类型的一个内存地址。指针是高级语言提供的抽象。引用这里的引用指的是Rust中的引用详见 4.4. 引用与借用。它就是指针但如果它指向的数据是动态大小的类型比如str或[T]那么引用会提供一个整数来保证知道数据的边界在哪里以防止越界。引用是Rust语言提供的抽象。1.1.3. Rust中的引用Rust的引用相比于原始指针有很多的好处- 引用始终引用的是有效的数据引用与usize的倍数是对齐的如果不对齐CPU的操作就会变慢。Rust通过填充字节来保证引用能在内存上对齐。对齐Alignment是指数据在内存中的存储地址必须是某个特定数值的倍数以满足硬件的访问要求并提高效率。在Rust中引用如T或mut T的地址总是对齐到usize的倍数这意味着它的起始地址是系统字长例如32位系统为4字节64位系统为8字节的整数倍。例如在64位系统中如果一个变量的地址是0x1001它不是8的倍数因此不能作为引用的地址而0x1000或0x1008则是有效的引用地址。引用可为动态大小的类型提供上述的保障。对于在内存中没有固定长度的类型Rust会保证它的长度会被保存在内部指针的路径这样就能知道知道数据的边界在哪里以防止越界。1.1.4. 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:i32 42; let b:[u8;10] B; let c:[u8;11] C; println!(a {}, b {:p}, c {:p}, a, b, c); }b是B的引用c是C的引用{:p}指的是打印出变量的内存地址输出a 42, b 0x1021d97e0, c 0x1021d97eaa、b和c在内存空间中的局部视图如下变量b和c是引用在32位CPU上占4字节在64位上占8字节这里是4字节a是i32类型所以在内存上占4字节静态变量B和C是两个数组数组里的元素是u8所以每个元素只占1字节这这个代码想要实现的是b模拟智能指针c模拟原始指针。这个例子还模拟得不够接近后续会有更逼真的例子现在就将就着吧。这是一个我们虚构的拥有49个字节的地址空间表示的是我们最终想要达到的效果所以会和上文的代码有出入。我们一点一点来解析-a是一个整数但由于图是我们假想的理想情况所以说图里的类型是i16占2字节不是原来的i32-b是一个智能指针总长度是4字节地址字段的长度只占2字节也就是u16。长度字段占2字节由于B是有10个元素的数组所以在长度字段存储的值就是10。地址字段存储的32表示数据所在的起始位置也就是0x20(32用16进制表示就是0x20)这个地方长度是10所以就是从0x20到0x29这块数据-c是一个原始指针占2个字节字节里存的就是地址。这里存的是16换成16进制就是0x10所以c指向的数据从0x10开始里面有11个元素所以指向的是0x10到0x1A的数据块。- 0x0是空字节(NULL byte)是程序的死区。如果指针指向这个地方再进行解引用就会崩溃。其他知识- 变量c是以0结尾的buffer其实这是C语言中字符串的内部表示形式C语言中的字符串是一个数组以0结尾。了解如何将这些类型转化为Rust中的类型对于通过外部函数接口(Foreign Function Interface简称FFI后面会详细地讲)处理外部代码是非常有用的。- 变量c和C在一起就叫做Rust里的CStr类型- 变量b实际上是一个长度为10固定长度的buffer但这个buffer不带终止符不以0结尾。当这个buffer在指针类型后面使用时会被称作后备数组- 变量b和B在一起几乎可以创建出Rust中的字符串类型但字符串类型还包含一个容量(capacity)字段。也就是说组成Rust字符串类型需要长度、地址和容量三个字段。

相关新闻

Day 02 · 环境搭建:一套装备打天下

Day 02 · 环境搭建:一套装备打天下

AI Python 系列」第 01 栏 AI 时代的 Python 办公自动化 全栏 20 篇 零成本跟完 🍃 品牌:梅雅达编程笔记 开篇 你是不是也卡在这一步 Day 01 说了,AI 办公自动化能帮你省钱省时间。很多读者看完热血沸腾——然后打开电脑,对…

2026/7/24 20:40:38阅读更多 →
Nintendo Switch大气层系统完全指南:从零开始打造你的终极游戏体验

Nintendo Switch大气层系统完全指南:从零开始打造你的终极游戏体验

Nintendo Switch大气层系统完全指南:从零开始打造你的终极游戏体验 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想要彻底释放Nintendo Switch的隐藏潜力吗?大气层…

2026/7/24 20:40:38阅读更多 →
终极文档下载神器:如何用kill-doc轻松下载任意文档

终极文档下载神器:如何用kill-doc轻松下载任意文档

终极文档下载神器:如何用kill-doc轻松下载任意文档 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决…

2026/7/24 20:40:38阅读更多 →
Linux 嵌入式平台数据库

Linux 嵌入式平台数据库

1.数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 2.常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、 SQLServer 小型:Sqlite 2.非关系型数据库 …

2026/7/24 22:06:53阅读更多 →
企业知识库 RAG 安全:当内部文档成为越狱的后门

企业知识库 RAG 安全:当内部文档成为越狱的后门

企业知识库 RAG 安全:当内部文档成为越狱的后门 一、当文档自己说话:RAG 系统的隐性越狱面 检索增强生成(RAG)已经成为企业把内部知识喂给大模型的主流方案。它让模型在回答前先去知识库里找相关片段,再把片段拼进上下…

2026/7/24 22:06:53阅读更多 →
五分钟解锁九大网盘真实下载链接:LinkSwift 完全使用指南

五分钟解锁九大网盘真实下载链接:LinkSwift 完全使用指南

五分钟解锁九大网盘真实下载链接:LinkSwift 完全使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

2026/7/24 22:06:53阅读更多 →
5分钟掌握本地图片搜索神器:告别海量图片管理烦恼的终极指南

5分钟掌握本地图片搜索神器:告别海量图片管理烦恼的终极指南

5分钟掌握本地图片搜索神器:告别海量图片管理烦恼的终极指南 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 还在为在数万张照片中寻…

2026/7/24 22:06:53阅读更多 →
如何快速掌握EZCard:面向桌游设计师的终极卡牌批量生成指南

如何快速掌握EZCard:面向桌游设计师的终极卡牌批量生成指南

如何快速掌握EZCard:面向桌游设计师的终极卡牌批量生成指南 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca…

2026/7/24 22:06:53阅读更多 →
AI内容粘贴后符号丢失怎么办?用AI导出鸭一键修复格式错乱问题

AI内容粘贴后符号丢失怎么办?用AI导出鸭一键修复格式错乱问题

1:AI内容粘贴后符号丢失怎么办?用AI导出鸭一键修复格式错乱问题 2:AI内容粘贴后符号丢失怎么办?AI导出鸭帮你解决Word导出难题 3:AI内容粘贴后符号丢失怎么办?AI导出鸭三种方式轻松搞定格式问题AI内容粘贴后…

2026/7/24 22:04:52阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →