当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]

Posted

技术标签:

【中文标题】当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]【英文标题】:How does the values of an array changes when we passed it as an argument to other function? [duplicate] 【发布时间】:2016-01-13 09:39:55 【问题描述】:

当我将一个数组作为参数传递给函数时,原来的数组被改变了,但数组不应该被改变,对吧?如有错误请指正。

下面我将一个 int x=10 作为参数传递给 change(int a) 函数。 原来的 int x 的值被改变了。

那么相同的代码如何以不同的方式影响数组和 int 呢?

public  class Runy  

public static void main(String [] args) 

    Runy p = new Runy();
    p.start();


void start() 

    long [] a1 = 3,4,5;
    long [] a2 = fix(a1);

    int x=10;
    int y= change(x);

    System.out.println(y);
    System.out.println(x);

    System.out.print(a1[0] + a1[1] + a1[2] + " ");
    System.out.println(a2[0] + a2[1] + a2[2]);



long [] fix(long [] a3) 

    a3[1] = 7;
    return a3;

int change(int a)

    a=a+1;
    return a;

【问题讨论】:

数组和整数是不同的。 【参考方案1】:

你错了。您传入的不是数组 - 它是数组的 reference。数组是 Java 中的引用类型,因此 a1(例如)的值不是数组对象 - 它是对数组对象的引用。

当您将该引用传递给 fix 时,参数 (a3) 具有与 a1 相同的值...该值引用同一个数组,因此在该方法之后对该数组的修改可见返回。此时,a1a2 将是相等的引用——它们都引用同一个数组。

【讨论】:

下面我将一个 int x=10 作为参数传递给 change(int a) 函数。原始 int x 的值发生了变化。那么相同的代码如何以不同的方式影响数组和 int 呢? @prabhakarReddyG:因为int 是值类型,而数组是引用类型。对于int x = 10;x 的值只是整数 10...它不是参考。【参考方案2】:

正如 Jon 所提到的,您传递的是对数组的引用,而不是新数组。如果您不想修改旧数组,请使用Arrays.copyOf,如下所示:

public class Runy 

    public static void main(String[] args) 
        Runy p = new Runy();
        p.start();
    

    void start() 
        long[] a1 = 3, 4, 5;
        long[] a2 = fix(Arrays.copyOf(a1, a1.length));

        System.out.println(a1[0] + ", " + a1[1] + ", " + a1[2]);
        System.out.println(a2[0] + ", " + a2[1] + ", " + a2[2]);

    

    long[] fix(long[] a3) 
        a3[1] = 7;
        return a3;
    

您也可以阅读System.arraycopy()。这是两种方法之间的区别:System.arraycopy() vs. Arrays.copyOf() in Java

【讨论】:

下面我将一个 int x=10 作为参数传递给 change(int a) 函数。原始 int x 的值发生了变化。那么相同的代码如何以不同的方式影响数组和 int 呢? 因为数组是来自整数的different。也就是说,数组再次通过引用传递,而像 ins 这样的原始类型通过值传递。通过引用传递参数的含义是将数据的内存地址发送给函数,函数内的更改将指向与“原始数组”相同的内存地址。如果您不想更改数组,则需要向函数发送“新”副本。 @pelumi:不,Java根本不使用传递引用。引用是按值传递的,但这是一回事。

以上是关于当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将数组中的所有值作为参数传递给函数

将数组作为参数传递给 C 中的函数

我可以将数组和变量作为参数传递给 C# 中的方法吗? [复制]

如何循环遍历动态大小的数组并将属性作为参数传递给可变参数函数?

如何将向量作为参数传递给另一个向量?

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?