Pointer vs Array
Un puntatore è un tipo di dati che contiene un riferimento a una posizione di memoria (cioè una variabile puntatore memorizza un indirizzo di una posizione di memoria in cui sono memorizzati alcuni dati). Gli array sono la struttura dati più comunemente utilizzata per memorizzare una raccolta di elementi. La maggior parte dei linguaggi di programmazione fornisce metodi per dichiarare facilmente gli array e accedere agli elementi negli array.
Cos'è un puntatore?
Un puntatore è un tipo di dati che memorizza un indirizzo di una posizione di memoria in cui sono memorizzati alcuni dati. In altre parole, un puntatore contiene un riferimento a una posizione di memoria. L'accesso ai dati archiviati nella posizione di memoria a cui fa riferimento il puntatore viene chiamato dereferenziazione. Quando si eseguono operazioni ripetitive come l'attraversamento di alberi / stringhe, ricerche in tabelle, ecc., L'uso dei puntatori migliora le prestazioni. Questo perché la dereferenziazione e la copia dei puntatori è più economica della copia e dell'accesso ai dati puntati dai puntatori. Un puntatore nullo è un puntatore che non punta a nulla. In Java, l'accesso a un puntatore nullo genera un'eccezione chiamata NullPointerException.
Cos'è un array?
Nella figura 1 è mostrato un pezzo di codice tipicamente utilizzato per dichiarare e assegnare valori a un array. La Figura 2 mostra come apparirebbe un array nella memoria.
valori [0] = 100; valori [1] = 101; valori [2] = 102; valori [3] = 103; valori [4] = 104; |
Figura 1: codice per la dichiarazione e l'assegnazione di valori a un array
100 | 101 | 102 | 103 | 104 |
Indice: 0 | 1 | 2 | 3 | 4 |
Figura 2: array archiviato in memoria
Il codice sopra definisce un array che può memorizzare 5 numeri interi e vi si accede utilizzando gli indici da 0 a 4. Una proprietà importante di un array è che l'intero array viene allocato come un singolo blocco di memoria e ogni elemento ottiene il proprio spazio nell'array. Una volta definito un array, la sua dimensione viene fissata. Quindi, se non sei sicuro della dimensione dell'array in fase di compilazione, dovresti definire un array abbastanza grande da essere al sicuro. Ma, la maggior parte delle volte, useremo effettivamente un numero di elementi inferiore a quello che abbiamo assegnato. Quindi una notevole quantità di memoria viene effettivamente sprecata. D'altra parte, se la "matrice abbastanza grande" non è effettivamente abbastanza grande, il programma andrebbe in crash.
Qual è la differenza tra puntatori e matrici?
Un puntatore è un tipo di dati che memorizza un indirizzo di una posizione di memoria in cui sono archiviati alcuni dati, mentre gli array sono la struttura dati più comunemente utilizzata per memorizzare una raccolta di elementi. Nel linguaggio di programmazione C, l'indicizzazione dell'array viene eseguita utilizzando l'aritmetica dei puntatori (cioè l'i esimo elemento dell'array x sarebbe equivalente a * (x + i)). Pertanto in C, un insieme di puntatori che puntano a un insieme di posizioni di memoria consecutive, può essere pensato come un array. Inoltre, c'è una differenza nel modo in cui l'operatore sizeof opera su puntatori e array. Quando applicato a un array, l'operatore sizeof restituirà l'intera dimensione dell'array, mentre quando applicato a un puntatore, restituirà solo la dimensione del puntatore.