Programmation en C++ – Différence entre un pointeur et un tableau

Les pointeurs et les tableaux sont fortement liés. En fait, les pointeurs et les tableaux sont interchangeables dans de nombreux cas. Par exemple, un pointeur qui pointe vers le début d’un tableau peut accéder à ce tableau en utilisant soit l’arithmétique de pointeur soit l’indice d’un tableau. Considérons le programme suivant:
 

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main () {
   int  v[MAX] = {33, 303, 226};
   int  *p;
 
   // nous avons l'adresse du tableau dans le pointeur.
   p = v;
 
   for (int i = 0; i < MAX; i++) {
      cout << "Adresse de v[" << i << "] = ";
      cout << p << endl;
 
      cout << "Valeur de v[" << i << "] = ";
      cout << *p << endl;
 
      // pointe vers l'emplacement suivant
      p++;
   }
 
   return 0;
}  

La sortie :

Adresse de v[0] = 0x7ffdf5e199d0
Valeur de v[0] = 33
Adresse de v[1] = 0x7ffdf5e199d4
Valeur de v[1] = 303
Adresse de v[2] = 0x7ffdf5e199d8
Valeur de v[2] = 226

 
 
Les pointeurs et les tableaux sont deux notations qui ne sont pas complètement interchangeables. Par exemple, considérez le programme suivant:

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main () {
   int  v[MAX] = {22, 222, 455};
 
   for (int i = 0; i < MAX; i++) {
      *v = i;    // C'est une syntaxe correcte
      v++;       // Ceci est incorrect.
   }
 
   return 0;
}

Il acceptable d’appliquer l’opérateur pointeur * à v, mais il est illégal de modifier la valeur de v. La raison c’est que v est une constante qui pointe vers le début d’un tableau et ne peut pas être utilisée comme l-value.

Étant donné qu’un nom de tableau génère un pointeur constante, il peut être utilisé dans des expressions de type pointeur, à condition qu’il ne soit pas modifié. Par exemple, ce qui suit est une instruction valide, qui attribue la valeur 66 à v[3]:

*(v + 3) = 66;

L’instruction ci-dessus est valide et sera compilée correctement car v n’a pas été modifié.
 
 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *