【发布时间】:2019-07-03 10:31:43
【问题描述】:
我不确定我是否正确理解 Pascal 中的引用传递是如何工作的。它是像在 C++ 中那样创建别名 (https://isocpp.org/wiki/faq/references),还是像在 C 中那样工作,并且过程获取指向变量的指针并使用该指针。
我想我可以将我的问题表述为:Pascal 是否支持真正的引用传递,还是通过调用共享来完成。
例如 FreePascal 引用状态,该过程获取一个指针 (https://www.freepascal.org/docs-html/current/ref/refsu65.html),但根据 https://swinbrain.ict.swin.edu.au/wiki/Pass_by_Value_vs._Pass_by_Reference#Conclusion 和例如 https://cgi.csc.liv.ac.uk/~frans/OldLectures/2CS45/paramPassing/paramPassing.html#callByReference 在 Pascal 中的引用传递与在 C 中的工作方式不同(其中传递指针)。
如果有人能解释一下差异或按引用传递的含义如何变化(在现代语言中,我们说按引用传递,但实际上它们是按值传递,例如 Java)。那么 pass by reference 的本义是什么,它是如何工作的呢?那么在 Pascal 中是怎样的呢?
非常感谢。
【问题讨论】:
-
实际上并没有太大区别,在pascal中你可以使用“var”关键字来传递地址。如果它说不支持,您必须自己构建指针,您也可以在 pascal 中执行此操作。在所有情况下,过程都会获得指向变量的指针。
-
按引用传递的工作方式与在 C 中的工作方式不同,但它具有不同的语法。它在各个地方都有解释,但请尝试我关于指针和引用的文章,Addressing pointers。
-
FWIW,Java 总是按值传递。但它也将references(看起来不像指针的指针)传递给按值的类。在那里,字符串或数组之类的东西也是类,所以可以解决。
-
@Mike:假设你在对我说:我的意思是对类实例的引用,是的。在 Java 中没有任何东西通过引用传递。引用类型也按值传递。引用类型是对非原始对象的引用。所以非基元不通过引用传递;对非基元的引用按值传递。大不同。
-
@Mike:支持我所说的许多参考资料中的两个:journaldev.com/3884/… 和 stackoverflow.com/a/40523/95954。再说一遍:Java 总是按值传递。这显然让初学者感到困惑。
标签: parameter-passing pass-by-reference pascal