首页 > 其他分享 >引用与借用

引用与借用

时间:2023-07-31 22:22:41浏览次数:35  
标签:悬垂 String let 引用 借用 fn 指针

引用(reference)

像一个指针,因为它是一个地址,我们可以由此访问储存于该地址的属于其他变量的数据。 与指针不同,引用确保指向某个特定类型的有效值。

点击查看代码
fn main() {
    let s1 = String::from("hello");

    let len = calculate_length(&s1);

    println!("The length of '{}' is {}.", s1, len);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}

可变引用

点击查看代码
fn main() {
    let mut s = String::from("hello");

    change(&mut s);
}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

数据竞争

数据竞争(data race)类似于竞态条件,它可由这三个行为造成:

两个或更多指针同时访问同一数据。
至少有一个指针被用来写入数据。
没有同步数据访问的机制。

悬垂引用(Dangling References)

在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针(dangling pointer),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。

点击查看代码
fn main() {
    let reference_to_nothing = dangle();
}

fn dangle() -> &String {
    let s = String::from("hello");

    &s
}

引用的规则

让我们概括一下之前对引用的讨论:
在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
引用必须总是有效的。

标签:悬垂,String,let,引用,借用,fn,指针
From: https://www.cnblogs.com/maomao1024/p/17594902.html

相关文章

  • C++ | 引用
    引用&使用引用intb=33,&a=b;b=17;cout<<a;//打印a为17使用引用声明变量类似于指针,声明的变量会同被引用的变量绑定,修改任何一方的数据都会使另一方的数据也改变。使用上的区别在于使用引用不需要*,引用可以理解为一个别名。在函数中使用引用传递参数将参......
  • 怎么还有函数参数不支持引用的?(Excel函数集团)
    函数公式中的参数绝大部分情况下是可以用以下四种:常量引用公式运算(包括函数、四则运算等)自定义名称有少部分函数的参数只支持引用,比如Sumif的第一、第三参数,Subtotal除第一参数以外的其他所有参数等等。但是,有一个函数的参数的特殊用法,只要是引用就会甩脸子,这个函数就是XL......
  • C# 使用SIMD向量类型加速浮点数组求和运算(4):用引用代替指针, 摆脱unsafe关键字,兼谈Unsa
    作者:zyl910目录一、引言二、办法说明2.1历史2.2局部引用变量与引用所指的值(类似指针的地址运算符&、间接运算符*)2.3重新分配局部引用变量(类似指针直接赋值)2.4引用地址调整(类似指针加减法)2.5引用地址比较(类似指针比较)2.6重新解释(类似C++的reinterpret_cast)2.7引用取消只......
  • 重温C#中的值类型和引用类型
    在C#中,数据类型分为值类型和引用类型两种。引用类型变量存储的是数据的引用,数据存储在数据堆中,而值类型变量直接存储数据。对于引用类型,两个变量可以引用同一个对象。因此,对一个变量的操作可能会影响另一个变量引用的对象。对于值类型,每个变量都有自己的数据副本,并且对一个变量的......
  • System.NullReferenceException:“未将对象引用设置到对象的实例。”
     c#中操作的变量都是对象对象则有属性和方法   未将对象引用  设置到  对象的实例就是对实例进行操作属性和方法时出错,也就是说该对象没有这个属性或者方法另外当操作的对象为空时,也会出现该错误。我这里就是操作的对象为空出错。因为我没用写入该字段。......
  • 相对路径以及python引用
    /当前工作目录所在的最顶级目录,即根目录,根目录是相对于其他子目录来说的./当前工作目录('./img/demo.jpg')../当前工作目录上一级目录(当前目录的父级目录)此时的img文件在myblog文件夹内python文件的引用问题fromPStope_Class.WorKFace.TYl_BeamUnitimportTYl_Beam......
  • 学习IDA权威指南-交叉引用
    使用IDA工具可以直观的提现代码与数据之间的关系。交叉引用一般使用xref表示1-代码交叉引用p-调用流j-跳转流2-数据交叉引用0-代表偏移地址引用r-读取引用w-写入引用3-交叉引用列表鼠标悬停,会出现引用的地方快捷键Ctrl+X函数列表......
  • 【C++学习之路】引用(reference)
    变量名实质上是一段连续内存空间的别名,是一个标号,程序通过变量来申请并命名内存空间。引用的本质:就是给变量名取一个别名普通变量的引用inta=10;//定义的时候,&修饰变量为引用b就是a的别名(引用)//洗头膏不会为引用开辟空间int&b=a;//引用必须初始化系统数组的引用intarr[5]......
  • c# WinForm 引用 Chrome 模拟操作
    Nuget CefSharp.WinForms publicForm1(){InitializeComponent();chromiumWebBrowser1.LoadingStateChanged+=ChromiumWebBrowser1_LoadingStateChanged;}privatevoidbutton1_Click(objectsender,EventArgs......
  • uni-app写微信小程序,data字段循环引用
    在写程序过程中,需要使用到globalData里的内容,而这个全局变量,在uni-app上需要通过:varapp=getApp();app.globalData.xxx=xxx来使用。我觉得每次都要获取app对象,嫌麻烦,就在data数据段里定义一个app字段,之后就通过this.app.globalData来使用,问题就出现在这。我用hbuilderX运行......