我在下面的代码中遇到了一个奇怪的问题:
public class Main {
public static void main(String args[]){
int[] c = {0};
int[] a = c;
int[] b = c;
a[0] = 1;
b[0] = 2*a[0];
System.out.println(" a " + a[0]);
}
}
这返回" a 2",而不是" 1",这意味着数组a的值发生了变化,即使该操作只会影响数组b ! 有谁知道这可能来自哪里,以及如何解决它?
答案 0 :(得分:4)
罪魁祸首在这里:
int[] c = {0};
int[] a = c;
int[] b = c;
您认为您正在创建三个不同的数组,但实际上它们都指向同一个数组c
。
System.out.println(a + "-" + b + "-" + c); //[I@1b6d3586-[I@1b6d3586-[I@1b6d3586
所有变量实际上都指向内存中的同一个数组。
答案 1 :(得分:0)
您所做的就是有效地创建与声明数组时相同数组的2个副本:
int[] a = c;
这与写作相同:
int* a = c;
写,c与& c [0]相同,它是数组的基地址。
所以:
int[] c = {0};
int[] a = c;
int[] b = c;
a[0] = 1; // This also sets the value of c[0] and b[0] to 1
b[0] = 2*a[0]; // This is 2 * 1 = 2