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.