TUTORIEL ALGO/METHODES 
Expliquez-moi... Les pointeurs
Compréhension et reconnaissance de cette fonctionnalité indispensable de certains langages, en particulier C et C++. (20/09/2005)
L'étude des pointeurs correspond souvent au stade où les apprentis développeurs lâchent prise, et préfèrent s'en remettre à des langages qui dissimulent leur gestion, voire l'intégralité de la gestion-mémoire. Il est vrai que réfléchir en terme de pointeur exige parfois quelques jonglages intellectuels pour se sortir des adresses-mémoires, des variables, et des variables qui pointent vers des variables...

  Forum

Réagissez dans les forums de JDN Développeurs

Ramené au dénominateur commun, un pointeur se définit comme suit : c'est une variable qui contient l'adresse en mémoire d'une autre variable. Jusqu'ici, cela reste accessible : une variable est stockée en mémoire, et sa position en mémoire est définie par une adresse précise. Cette adresse peut être traitée au moyen d'un pointeur, à savoir une variable contenant cette adresse.

Une variable de cette sorte fait donc référence à une autre variable en mémoire. L'action de récupérer cette autre variable par le biais de la variable-pointeur s'appelle "déréférencer" le pointeur.

Les pointeurs sont surtout utilisés dans les programmes écrits en C et C++, et bien sûr en assembleur. D'autres langages les utilisent également, sous une forme plus ou moins protégée : Pascal, C#, Fortran, Ada, Modula-2, Oberon.

Java est réputé par exemple pour ne pas utiliser les pointeurs, mais ne fait en fait que les dissimuler au développeurs aux travers de références. Cela se vérifie avant l'affichage d'une exception NullPointerException : les pointeurs sont très présents en Java, mais implicites - on ne peut pas les manipuler directement.

Reste qu'en surface, l'intérêt peut sembler limité pour une telle complexité. D'autres peuvent arguer qu'un langage moderne n'a aucun intérêt à compliquer la tâche d'un développeur, et devrait cacher ce genre de détails qui le divertissent de sa tâche principale : construire une application qui marche. C'est mal connaître les capacités et avantages des pointeurs.

Les pointeurs sont la clef d'une grande flexibilité pour les langages assez bas-niveau comme C et C++. Utilisés en combinaison avec des tableaux ou des fonctions (voire des structures complètes), ils peuvent, bien manipulés, permettre de construire un code compact et efficace.

Pour commencer, le passage des paramètres en C se fait par valeur (et non par référence). De fait, les pointeurs sont le seul moyen de modifier le contenu des variables déclarées dans d'autres fonctions. Les pointeurs rendent donc possibles le traitement des tableaux et des chaînes dans des fonctions, ainsi que le renvoi de plusieurs valeurs par une fonction.

Autres usages obligeant à l'utilisation du pointeur : le tableau, dont le nom est un pointeur sur son premier élément. Enfin, plus généralement, il permet de construire des structures dynamiques (dont la taille peut évoluer au cours du temps).

  Forum

Réagissez dans les forums de JDN Développeurs

Il est donc important de savoir au moins comprendre et reconnaître des pointeurs dans un code source. En C, ils se signalent par deux opérateurs : & pour obtenir l'adresse en mémoire d'une variable, et * pour accéder au contenu d'une adresse-mémoire.

main() {
//x contient la valeur 10
  short x = 10;

// y contient la valeur 100
  short y = 100;

// P est un pointeur, référençant une adresse contenant un short
  short *P;

// P pointe vers l'adresse de x
  P = &x;

// y contient le contenu de x (via P)
  y = *P;

// x contient la valeur 1000 (via P)
  *P = 1000;
  return 0;
  }


Les pointeurs peuvent prendre d'autres formes, parfois bien plus compliquées. Cette présentation devrait vous sortir des variantes les plus courantes.
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages