首页 > 解决方案 > 是否存在任何语言的 REAL 引用传递?

问题描述

据我所知,c 中没有按引用传递,而 java 基本上按值传递所有内容,有几十个堆栈溢出帖子讨论了这个问题。

现在我想知道有没有 REAL 通过引用调用的例子?因为在函数调用期间,所有参数(包括指针或可变对象标识符)的值总是被复制到被调用者框架中的局部变量中,从这个意义上说,一切都肯定按值传递。

标签: pass-by-reference

解决方案


当然,有。例如,C♯ 具有传递引用。为了发生引用传递,声明站点的参数列表中的方法参数以及调用站点的参数列表中的方法调用参数都必须使用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.
    }
}

推荐阅读