Originariamente inviato da 1_1_enrico_1_1
In java se passi un array ad un metodo e, all'interno di esso, lo modifichi non ottieni che l'array originale viene anch'esso modificato?
Sì, se modifichi l'oggetto, ma non se ne istanzi uno nuovo (ad esempio, con new() ).
Al metodo viene passato il riferimento, non una copia del riferimento.
Sbagliato, è esattamente il contrario.
Vediamo, passo passo, cosa succede nel tuo codice.
Per semplicità cambio i nomi dei parametri del metodo "potenzamatrice()":
codice:
public static void potenzamatrice(int[][] m1, int n1)
{
if(n1>1)
{
potenzamatrice(m1, n1/2);
m1=AlgoritmiMatrici.prodotto(m1,m1);
}
if(n1%2==1)
{
int a[][]={{1,1},{1,0}};
m1=AlgoritmiMatrici.prodotto(m1,a);
}
}
Andiamo a vedere che succede in memoria, passo per passo, durante l'esecuzione, guardando solo alle variabili che riguardano le matrici.
codice:
int idn[][] = AlgoritmiMatrici.identita(2);
Situazione della memoria:
idn --> 0x01
0x01 è un numero a caso che indica una posizione in memoria.
Situazione della memoria:
idn --> 0x01;
m --> 0x01;
Anche "m" punta alla stessa posizione in memoria.
codice:
potenzamatrice(m, n-1);
Situazione della memoria:
idn --> 0x01;
m --> 0x01;
m1 --> 0x01;
Anche m1 punta alla stessa posizione in memoria.
codice:
... // potrebbero esserci delle chiamate ricorsive a potenzamatrice()
m1 = AlgoritmiMatrici.prodotto(m1, m1);
Situazione della memoria:
idn --> 0x01;
m --> 0x01;
m1 --> 0x02;
Quando il metodo termina, il parametro m1 punta ad una matrice diversa... ma le variabili originarie (m e idn) continuano a puntare alla stessa identica matrice di prima.
Se AlgoritmiMatrici.prodotto() non modifica la matrice in ingresso, ma ne costruisce una nuova, le variabili di partenza ( quelle del metodo matrice1() ) continueranno a vedere gli stessi identici dati di partenza.
Ciao.