Programmation C-C++/Types avancés

En cours d'importationlink={{{link}}}

Ce livre est en cours de copie depuis le site http://casteyde.christian.free.fr/cpp/cours/online/book1.html qui le fournit sous licence GFDL.

Cours de C/C++
Le langage
Première approche
Les structures de contrôle
Types avancés
Pointeurs et références
Le préprocesseur
Modularité et compilation
Écrire du code illisible
C++ : La couche objet
C++ : Les exceptions
Identification des types
Les espaces de nommage
Les templates
La bibliothèque standard
Notions de base
Les types complémentaires
Les flux d'entrée / sortie
Les locales
Les conteneurs
Les algorithmes
Conclusion
Priorités des opérateurs
Draft Papers
Bibliographie

Livre original de C. Casteyde
Modifier le modèle

Les pointeurs et références

modifier

Les 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

modifier

Voici 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).