Pointeur (programmation) - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

Un pointeur est en programmation une variable contenant une adresse mémoire.

Utilité

Le pointeur a pointe sur la variable b. On peut noter que b contient un nombre (en hexadécimal 00000011 = en décimal 17), et que a contient l'adresse de b en mémoire (en hexadécimal 1008). Dans ce cas précis, l'adresse et la donnée sont contenues dans 32 bits.

La notion de pointeur reflète l'utilisation différente que l'on peut faire d'un nombre entier, à savoir indiquer une adresse mémoire. Cette utilisation est très différente d'une utilisation arithmétique, d'où la création de registres processeurs spécifiques (les registres d'adresse) et d'un type de donnée spécifique dans les langages de programmations.

Les pointeurs "typés", le type le plus répandu de pointeur actuellement, sont apparus avec le langage C, qui a ajouté un typage sur les données pointées par le pointeur. Quand on incrémente un tel pointeur, il n'est en fait pas forcément incrémenté de un, mais de la taille du type pointé.

L'utilisation des pointeurs permet d'avoir accès à la couche basse de l'ordinateur, un accès direct à la mémoire. On peut littéralement se déplacer de case mémoire en case mémoire. Cette technique permet d'effectuer des optimisations sur l'utilisation de la mémoire ou la performance en termes de vitesse.

Les pointeurs sont entre autres utilisés pour stocker les adresses des zones mémoires allouées dynamiquement par l'application. Si on alloue un bloc de taille T et qu'on reçoit l'adresse A en retour, cela veut dire que le bloc occupe la mémoire à partir de l'adresse A jusqu'à l'adresse A+T-1.

Dans les langages de plus haut niveau, l'utilisation des pointeurs est supprimée, au profit des références et des tableaux dynamiques gérés par le compilateur. Les références remplissent certaines fonctions des pointeurs en supprimant l'accès à la mémoire. Cela évite beaucoup de problèmes, en contrepartie certaines utilisations et optimisations ne sont plus possibles.

Langages utilisant les pointeurs

Les pointeurs sont, entre autres, utilisés par le C, le C++, le Pascal, Ada, FreeBASIC, Fortran, C#, D, Modula-2, Oberon et bien sûr l'Assembleur.

Pointeurs en Assembleur

Ce langage ne connait en fait que deux notions pour stocker des données : les registres (assimilables à des variables globales), et les adresses mémoire (qui sont très précisément des pointeurs). Le langage est tellement proche de la machine qu'il est quasiment impossible de se passer de la notion de pointeur.

Pointeurs en C et C++

Les deux principaux langages utilisant énormément les pointeurs sont le C et le C++. Dans ces langages, un pointeur est déclaré avec une étoile '*' postposé au type. On récupère l'adresse d'une variable avec un et commercial '&'.

L'étoile, préposée, sert également à déréférencer l'adresse d'un pointeur, autrement dit à avoir accès au contenu « pointé » par ledit pointeur.

Voici un petit exemple :

      int a = 2;       // Déclaration de la variable a de type int (entier) et initialisé avec 2      int * p = NULL;  // Déclaration d'un pointeur sur un int qui vaut NULL      p = &a ;         // L'adresse de a est affecté au pointeur p      //Actuellement a vaut 2      *p = 5;          // Déréférencement de p, pour affecter 5 à la variable a      //Maintenant a vaut 5      

Pointeurs en Pascal

La syntaxe en Pascal est très similaire à celle en C et C++, à l'exception notable que le symbole de déréférencement est inversé par rapport au C et C++. Les pointeurs typés sont déclarés avec un chapeau '^' préposé au type pointé. On récupère l'adresse d'une variable avec une arrobase '@'.

Le chapeau sert également à déréférencer l'adresse d'un pointeur, mais alors il est postposé. L'exemple ci-dessus s'écrit donc en Pascal ainsi :

      var a: integer;    { Déclaration de la variable a de type integer (entier) }          p: ^integer;   { Déclaration de la variable p de type pointeur sur entier }             begin          a := 2;        { Iinitialisation de a à 2 }          p := @a;       { Adresse de a affectée au pointeur p }          p^ := 5;       { Déréférencement de p, pour affecter 5 à la variable a }      end;      

Certains types de pointeurs peuvent être prédéfinis dans certaines implémentation du Pascal, comme Delphi :

      type          pchar = ^char;          pinteger = ^integer;      
Page générée en 0.092 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales | Partenaire: HD-Numérique
Version anglaise | Version allemande | Version espagnole | Version portugaise