Puntatori vs array
Esiste una stretta somiglianza tra puntatori e array dovuta alla possibilita`
di dereferenziare un puntatore nello stesso modo in cui si seleziona l'elemento
di un array e al fatto che lo stesso nome di un array e` di fatto un puntatore
al primo elemento dell'array:
int Array[] = { 1, 2, 3, 4, 5 };
int* Ptr = Array; // equivale
a Ptr = &Array[0];
cout << Ptr[3] << endl; // Ptr[3]
equivale a *(Ptr+3);
Ptr[4] = 7; //
equivalente a *(Ptr+4) = 7;
La somiglianza diviene maggiore quando si confrontano array e puntatori a caratteri:
char Array[] = "Una stringa";
char* Ptr = "Una stringa";
// la seguente riga stampa tutte e due le
stringhe
// si osservi che non e` necessario dereferenziare
// un char* (a differenza degli altri tipi di
// puntatori)
cout << Array << " == " << Ptr <<
endl;
// in questo modo, invece, si stampa solo
un carattere:
// la dereferenzazione di un char* o l'indicizzazione
// di un array causano la visualizzazione di un solo
// carattere perche` in effetti si passa all'oggetto
// cout non un puntatore a char, ma un oggetto di tipo
// char (che cout tratta giustamente in modi diversi)
cout << Array[5] << " == " << Ptr[5]
<< endl;
cout << *Ptr << endl;
In C++ le dichiarazioni char Array[] = "Una stringa"
e char* Ptr = "Una stringa" hanno lo stesso effetto,
entrambe creano una stringa (terminata dal carattere nullo) il cui indirizzo
e` posto rispettivamente in Array e in Ptr , e come
mostra l'esempio un char* puo` essere utilizzato esattamente come
un array di caratteri.
Esistono tuttavia profonde differenze tra puntatori e array: un puntatore e`
una variabile a cui si possono applicare le operazioni viste sopra e che puo`
essere usato come un array, ma non e` vero il viceversa, in particolare il nome
di un array non e` un puntatore a cui e` possibile assegnare un nuovo valore
(non e` cioe` modificabile). Ecco un esempio:
char Array[] = "Una stringa";
char* Ptr = "Una stringa";
Array[3] = 'a'; // Ok!
Ptr[7] = 'b'; // Ok!
Ptr = Array; // Ok!
Ptr++; //
Ok!
Array++; //
Errore, tentativo di assegnamento!
In definitiva un puntatore e` piu` flessibile di quanto non lo sia un array,
anche se a costo di un maggiore overhead.
|