2016-09-17 20 views
0

我面臨在下面的代碼段一個奇怪的問題:的陣列變化而沒有任何命令中的值影響它

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]); 
} 
} 

這將返回「2」,而不是「1」,意思是即使該操作只應該影響數組b的值,數組的值也會發生變化! 有誰知道這可能來自哪裏,以及如何解決它?

+0

我不知道java中如何實現陣列。但是我的假設是'a = c'和'b = c'使得'a'和'b'引用與'c'相同的數組(即'a [0]'和'b [0] '實際上是相同的記憶位置)。 –

+0

[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve) – buhtz

回答

4

罪魁禍首是在這裏:

int[] c = {0}; 
int[] a = c; 
int[] b = c; 

你以爲你創建三個不同的陣列,但實際上他們都指向同一個陣列c

System.out.println(a + "-" + b + "-" + c); //[[email protected][[email protected][[email protected] 

所有變量實際上都指向內存中的同一個數組。

+0

感謝您的幫助,我明白了! - 這仍然是所有其他變量類型的問題? (int,double等)? - 如何創建幾個使用相同值初始化的不同變量?例如,如果我想創建10個初始化爲值{0}的數組,我必須一個接一個地完成嗎? –

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