谈谈引用和求值策略

  1. 说说引用
    1. 指针
    2. 地址
    3. 引用
    4. 小结
  2. 说说求值策略
    1. 通过值调用
    2. 通过引用调用
    3. 通过共享调用

说说引用

搞清楚引用之前先看看值是什么。在计算机科学中,一个值代表了一个程序可操作控制的实体。某种数据类型的一些成员就是这种类型的一些值。

指针

在计算机科学中,指针是一个对象,它存储了另一个在内存中值的内存地址。一个指针引用了内存中的一个位置。

地址

在计算机中,一个内存地址是一个对一块特定内存位置的引用。

引用

在计算机科学中,引用是一个值,它能够让程序在内存或其他设备存储中间接获取到特定的数据,比如变量的值或者一个记录。对一个给定系统中存储在内存中的引用,它的实现是数据存储在内存或其他设备存储空间中的物理地址。但是正是由于刚才这种说法导致了大家对指针和地址的错误的混淆,并说一个引用是指向了这个数据。然而,引用的可能以其他的方式来实现。

小结

引用不是指针,因为它可能实现方式是保存了一个物理地址,也可能是别的方式,比存的一个相对的地址偏移,而指针则是保存一个物理地址,显得更加狭义一点。同时,引用是一个值。

说说求值策略

求值策略是程序语言决定什么时候来求一个函数调用的实参的值,同时计算什么类型的值来传递给一个函数。

通过值调用

通过值调用也被说是传递值。在这种方式中,实参表达式被计算的结果会绑定到调用后相匹配的变量上(对应于形参的位置),并且将这个值复制后放到一个新的内存区域。这种方式的特点是,函数作用域外的被传递的变量是不变的。

通过引用调用

通过引用调用也被说是传递引用。在这种方式中,函数接受一个变量的隐式引用作为实参,而不是它的值的拷贝。这种方式的特点是,函数作用域外被传递的变量也会被改变。

通过共享调用

通过共享调用也被说是通过对象或通过对象共享调用,Java,Python,JavaScript中都存在这中求值策略。关键在于传递的是一个对象,这个对象并没有被复制放到一个新的内存区域,而是在调用者和被调用者的作用域中共享着。和通过值调用的不同是,这个对象在调用者作用域中被修改了。和通过引用调用的不同是,获取值的权限并不在调用者,因为传递的不是一个引用,而是一个对象。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

×

喜欢就点赞,疼爱就打赏