是否存在任何语言的REAL REAL引用参考?

时间:2018-07-16 14:16:02

标签: pass-by-reference

据我所知,c语言中没有通过引用的传递,而java本质上是按值传递所有东西的,因此有数十个有关此问题的堆栈溢出文章。

现在,我想知道是否存在通过引用进行REAL调用的示例?因为在函数调用过程中,所有参数(包括指针或可变对象标识符)的值始终会复制到被调用方框架中的局部变量,所以从某种意义上说,一切必定会通过值传递。

1 个答案:

答案 0 :(得分:1)

当然可以。例如,C 3具有通过引用。为了进行传递引用,必须在声明站点的参数列表中的方法参数以及在调用站点的参数列表中的方法调用参数都用ref修饰符进行注释。同样适用于Visual Basic.NET(我相信这里的修饰符为ByRef。)

C ++也具有传递引用,修饰符为&。 PHP还具有传递引用,并使用相同的修饰符。同样适用于E。

Rust还提供按引用致电。

与上面列出的所有语言相比,默认值是传值,必须显式地请求引用引用,而Fortran II是引用引用语言。

  

现在,我想知道是否存在通过引用进行REAL调用的示例?因为在函数调用过程中,所有参数(包括指针或可变对象标识符)的值始终会复制到被调用方框架中的局部变量,所以从某种意义上说,一切必定会通过值传递。

您所描述的是传递值。那不是通过引用。通过按引用传递,将传递引用本身,而不是所引用的值。

这里是C♯中的一个示例,该示例演示了值类型的值传递,引用类型的值传递,值类型的引用和值传递参考类型:

struct MutableCell
{
    public string value;
}

class Program
{
    static void IsCSharpPassByValue(string[] foo, MutableCell bar, ref string baz, ref MutableCell qux)
    {
        foo[0] = "More precisely, for reference types it is call-by-object-sharing, which is a special case of pass-by-value.";
        foo = new string[] { "C# is not pass-by-reference." };

        bar.value = "For value types, it is *not* call-by-sharing.";
        bar = new MutableCell { value = "And also not pass-by-reference." };

        baz = "It also supports pass-by-reference if explicitly requested.";

        qux = new MutableCell { value = "Pass-by-reference is supported for value types as well." };
    }

    static void Main(string[] args)
    {
        var quux = new string[] { "Yes, of course, C# *is* pass-by-value!" };

        var corge = new MutableCell { value = "For value types it is pure pass-by-value." };

        var grault = "This string will vanish because of pass-by-reference.";

        var garply = new MutableCell { value = "This string will vanish because of pass-by-reference." };

        IsCSharpPassByValue(quux, corge, ref grault, ref garply);

        Console.WriteLine(quux[0]);
        // More precisely, for reference types it is call-by-object-sharing, which is a special case of pass-by-value.

        Console.WriteLine(corge.value);
        // For value types it is pure pass-by-value.

        Console.WriteLine(grault);
        // It also supports pass-by-reference if explicitly requested.

        Console.WriteLine(garply.value);
        // Pass-by-reference is supported for value types as well.
    }
}