Programmation C-C++/Types avancés
Les pointeurs et références
modifierLes pointeurs sont des variables très utilisées en C et en C++. Ils doivent être considérés comme des variables, il n'y a rien de sorcier derrière les pointeurs. Cependant, les pointeurs ont un domaine d'application très vaste.
Les références sont des identificateurs synonymes d'autres identificateurs, qui permettent de manipuler certaines notions introduites avec les pointeurs plus souplement. Elles n'existent qu'en C++.
Parlons d'abord de Pointeurs
modifierVoici un exemple de pointeur : int * pp;
signifie que pp
est une variable qui contient un pointeur vers un entier, ou encore contient l'adresse d'un nombre entier.
On peut se poser la question, pour préciser le type pointé, ici int
(entier), simplement par ce que le système fait des calculs d'adresse et doit connaître le déplacement à faire pour trouver l’élément suivant.
Regardons la différence entre les codes suivants :
double nbReel[4]= { 10.5, 17.5, 23, 56};
int nbEnt [4] = { 5, 6, 9, 44};
double *nb1; int *nb2;
nb1 = nbReel;
nb2 = nbEnt;
Ici nb1 reçoit l'adresse du tableau nbReel, qu on peut aussi écrire nb1 = &nbReel[0]
nb1 + 1 est l’adresse du suivant. C'est-à-dire de nbReel[1], pour se fixer les idées, supposons que le tableau nbReel est implémenté en mémoire à l'adresse 1200, qui est donc l'adresse de nbReel[0], alors l'adresse de nbReel[1] est 1208 (ou encore nb1+1 est 1208), on ajoute 8, parce que la taille d'un nombre "double" est 8 octets (bytes). maintenant supposons que l'adresse de nbEnt[0] (même chose que nbEnt) soit 2200 alors adresse de nbEnt[1] est 2204, car la taille d'un entier est 4 octets. C'est-à-dire nb2 + 1
est 2204.
De plus maintenant que le pointeur nb1 contient l'adresse de début de zone nbReel, on peut accéder à n'importe quel élément du tableau NbReel avec le pointeur nb1, par exemple : *nb1 représente l'objet pointe par nb1, c'est-à-dire valeur 10.5.
Et *(nb1+1) représente l'objet pointe par nb1 +1, c'est-à-dire valeur suivante : 17.5. Attention à la parenthèse ! *nb1 + 1 : veut dire on ajoute 1 à l'objet pointe par nb1 (on ajoute 1 au nombre réel 10.5 : ce qui donne 11.5).