Punteros de C ++ frente a matrices

Los punteros y las matrices están estrechamente relacionados. De hecho, los punteros y las matrices son intercambiables en muchos casos. Por ejemplo, un puntero que apunta al principio de una matriz puede acceder a esa matriz utilizando aritmética de puntero o indexación de estilo de matriz. Considere el siguiente programa:

#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;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Sin embargo, los punteros y las matrices no son completamente intercambiables. Por ejemplo, considere el siguiente programa:

#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;
}

Es perfectamente aceptable aplicar el operador de puntero * a var, pero es ilegal modificar el valor de var. La razón de esto es que var es una constante que apunta al comienzo de una matriz y no se puede usar como valor l.

Debido a que un nombre de matriz genera una constante de puntero, aún se puede usar en expresiones de estilo de puntero, siempre que no se modifique. Por ejemplo, la siguiente es una declaración válida que asigna a var [2] el valor 500 -

*(var + 2) = 500;

La declaración anterior es válida y se compilará correctamente porque var no se cambia.