Array Bidimensionale

di il
4 risposte

Array Bidimensionale

Buongiorno a tutti, vorrei porvi una domanda riguardo un metodo da applicare a questo tipo di array:

public static int[][] mistero(int[][] a) {
    int[][] ris = new int[a.length][];
    for (int i=0; i<a.length; i++)
        ris[i] = a[a.length-1-i];
    return ris;
}

public static void main(String[] args) {
    int[][] v = {
        { 1, 2, 3 },
        { 4, 5, 6 }
    };
    int[][] c = mistero(v);
    c[0][2]++;
    System.out.println(v[1][2]+" " c[0][2]);
}
Secondo ciò che ho capito, l'array [][]c che viene generato dal metodo mistero, è un array la cui riga 0 è uguale alla riga 1 di [][]v e la riga 1 è uguale alla riga 0 di [][]v. Dopodiché tramite c[0][2]++ aumentiamo di uno il valore di quell'intero (che quindi diventa 7).
Ciò che non capisco è come mai si modifica anche il valore di v[1][2] che dovrebbe essere 6, mentre il metodo stampa 7 7 .
A cosa è dovuta questa modifica ?
Grazie a tutti

4 Risposte

  • Re: Array Bidimensionale

    Ciao inggestionale,
    Un array bidimensionale è un array di array, cioe un array di puntatori ad array (e non è una matrice quadrata come si potrebbe credere).

    Se guardi bene la funzione 'mistero' vedi che non duplica le righe ma le assegna al nuovo array, quindi avrai dei puntatori alla stessa area di memoria.

    Per duplicare anche le righe la funzione 'mistero' dovrebbe fare così:
    
    public static int[][] mistero(int[][] a) {
        int[][] ris = new int[a.length][];
        for (int i = 0; i < a.length; i++)
        {
            int index = a.length - 1 - i;
            int rowLength = a[index].length;
            ris[i] = new int[rowLength];
            for (int j = 0; j < rowLength; j++)
                 ris[i][j] = a[index][j];
        }
        return ris;
    }
    
  • Re: Array Bidimensionale

    Grazie Barba59, sempre gentilissimo.
    Quello che non capisco è: se i puntatori si riferiscono alla stessa area, perché v[1][2] e c[1][2] (ad esempio) restituiscono valori diversi, mentre c[0][2]++ modifica anche v[1][2] ?
  • Re: Array Bidimensionale

    Ciao inggestionale,
    la situazione dopo aver chiamato 'mistero' (quella che non duplica le righe) è questa:

    v[0] -> { 1, 2, 3 }
    v[1] -> { 4, 5, 6 }

    c[0] -> { 4, 5, 6 }
    c[1] -> { 1, 2, 3 }

    per cui v[1][2]==6 e c[1][2]==3 quindi è giusto che siano diversi.

    Detto in altre parole
    v[0] e c[1] puntano a { 1, 2, 3 }
    v[1] e c[0] puntano a { 4, 5, 6 }

    Quindi agendo su c[0] modifichi l' area a cui punta v[1].

    Spero di non aver fatto confusione
  • Re: Array Bidimensionale

    Ora sei stato chiarissimo. Mi permetto di darti del tu, dato che è la terza volta che chiedo il tuo aiuto.
Devi accedere o registrarti per scrivere nel forum
4 risposte