Puntatori C ++ vs array
I puntatori e gli array sono fortemente correlati. In effetti, in molti casi i puntatori e gli array sono intercambiabili. Ad esempio, un puntatore che punta all'inizio di un array può accedere a tale array utilizzando l'aritmetica del puntatore o l'indicizzazione in stile array. Considera il seguente programma:
#include <iostream>
using namespace std;
const int MAX = 3;
int main () {
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have array address in pointer.
ptr = var;
for (int i = 0; i < MAX; i++) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the next location
ptr++;
}
return 0;
}
Quando il codice precedente viene compilato ed eseguito, produce un risultato come segue:
Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200
Tuttavia, i puntatori e gli array non sono completamente intercambiabili. Ad esempio, considera il seguente programma:
#include <iostream>
using namespace std;
const int MAX = 3;
int main () {
int var[MAX] = {10, 100, 200};
for (int i = 0; i < MAX; i++) {
*var = i; // This is a correct syntax
var++; // This is incorrect.
}
return 0;
}
È perfettamente accettabile applicare l'operatore puntatore * a var ma è illegale modificare il valore var. Il motivo è che var è una costante che punta all'inizio di un array e non può essere utilizzata come valore l.
Poiché un nome di matrice genera una costante del puntatore, può ancora essere utilizzato nelle espressioni in stile puntatore, purché non venga modificato. Ad esempio, la seguente è un'istruzione valida che assegna a var [2] il valore 500 -
*(var + 2) = 500;
L'istruzione sopra è valida e verrà compilata correttamente perché var non viene modificata.