Un pointeur est en programmation une variable contenant une adresse mémoire.
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.
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.
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.
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
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;