Pointeurs ou références ?

Il est très important de distinguer les pointeurs, qui sont des adresses mémoire, des références qui sont des variables de types très divers. On notera en particulier que les pointeurs sont tous formellement identiques, bien que l’écriture suivante soit interdite :

char *p;
int *q = p;    // interdit, types de pointeurs différents

pour des raisons de précautions ; il faut écrire :

char *p;
int *q = (int*) p;

c’est-à-dire utiliser un changement de type, afin que le compilateur accepte l’affectation ; dans ce cas, p et q ont exactement la même valeur : les modifications apportées à *p, c’est-à-dire à l’emplacement de mémoire pointé par p, se répercuteront donc forcément sur *q, puisqu’il s’agit de la même place mémoire. On a donc ainsi une partie de la mémoire accessible de deux façons différentes (comme avec les références), mais sous deux types différents aussi (contrairement aux références). En général, de tels comportements ne sont pas souhaitables.

Le schéma suivant illustre la différence entre pointeur et référence. On suppose les déclarations suivantes :

double d = 1.2, &dd = d, *p = &d;

d’une variable de type double (huit octets en mémoire à l’adresse 1000 par exemple), d’une référence dd (aucun octet puisqu’il s’agit de la même variable) et d’un pointeur (deux octets pour un pointeur court, à l’adresse 2000 par exemple). Voici donc l’état de la mémoire (chaque carré indique un octet) :

Précédent Précédent Sommaire Sommaire Suivant Suivant