Ponteiros C ++ vs Arrays

Ponteiros e arrays estão fortemente relacionados. Na verdade, ponteiros e matrizes são intercambiáveis ​​em muitos casos. Por exemplo, um ponteiro que aponta para o início de uma matriz pode acessar essa matriz usando aritmética de ponteiro ou indexação no estilo de matriz. Considere o seguinte 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;
}

Quando o código acima é compilado e executado, ele produz um resultado como o seguinte -

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

No entanto, ponteiros e matrizes não são completamente intercambiáveis. Por exemplo, considere o seguinte 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;
}

É perfeitamente aceitável aplicar o operador de ponteiro * a var, mas é ilegal modificar o valor de var. A razão para isso é que var é uma constante que aponta para o início de uma matriz e não pode ser usada como valor l.

Como um nome de array gera uma constante de ponteiro, ele ainda pode ser usado em expressões de estilo de ponteiro, desde que não seja modificado. Por exemplo, o seguinte é uma declaração válida que atribui a var [2] o valor 500 -

*(var + 2) = 500;

A instrução acima é válida e será compilada com sucesso porque var não foi alterado.