Pointeurs et références
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy. Leçon 13 sur 104.
Maintenant que tu comprends la mémoire de pile et la mémoire de tas, explorons les outils qui te permettent de travailler directement avec les emplacements mémoire : les pointeurs et les références.
Un pointeur stocke l’adresse mémoire d’une autre variable. Vous le déclarez avec * et obtenez une adresse à l’aide de &.
int value = 42;
int* ptr = &value; // ptr contient l'adresse de value
std::cout << ptr; // Affiche l'adresse mémoire
std::cout << *ptr; // Déréférencement : affiche 42Une référence est un alias pour une variable existante. Une fois liée, elle fait toujours référence à cette variable. Vous la déclarez avec &.
int value = 42;
int& ref = value; // ref est un alias pour value
ref = 100; // Modifie value à 100
std::cout << value; // Affiche 100Différences clés :
| Pointeurs | Références |
|---|---|
| Peuvent être nuls | Doivent être initialisées |
| Peuvent être réassignés | Ne peuvent pas être réaffectées |
Utilisez * pour accéder à la valeur | Accédez directement à la valeur |
| Peuvent ne pointer vers rien | Toujours valides |
Les deux sont essentiels pour transmettre efficacement des objets aux fonctions sans les copier et pour travailler avec de la mémoire allouée sur le tas. Les références sont plus sûres et plus simples, tandis que les pointeurs offrent davantage de flexibilité lorsque vous devez les réaffecter ou vérifier s’ils sont nuls.
Défi
FacileConstruisons un système simple de manipulation de valeurs qui montre comment les pointeurs et les références fonctionnent différemment lorsqu’ils modifient des données.
Tu vas créer deux fichiers pour organiser ton code :
ValueOps.h: définir trois fonctions qui modifient des valeurs entières de différentes manières :doubleByPointer(int* ptr): prend un pointeur et double la valeur vers laquelle il pointetripleByReference(int& ref): prend une référence et triple la valeurswapValues(int* a, int* b): prend deux pointeurs et échange les valeurs vers lesquelles ils pointent
main.cpp: lire deux entiers depuis l’entrée, puis démontrer l’utilisation des pointeurs et des références :- Afficher les valeurs originales :
"Original: <first> <second>" - Utiliser
doubleByPointersur la première valeur, puis afficher :"After double: <first>" - Utiliser
tripleByReferencesur la deuxième valeur, puis afficher :"After triple: <second>" - Utiliser
swapValuespour échanger les deux valeurs, puis afficher :"After swap: <first> <second>"
- Afficher les valeurs originales :
Lorsque tu appelles des fonctions avec des pointeurs, pense à utiliser l’opérateur d’adresse (&) pour transmettre l’adresse de la variable. Les références fonctionnent de manière plus naturelle : il suffit de transmettre directement la variable.
Inclus ton fichier d’en-tête dans main.cpp en utilisant #include "ValueOps.h".
Essayez vous-même
#include <iostream>
#include "ValueOps.h"
using namespace std;
int main() {
// Lire deux entiers depuis l'entrée
int first, second;
cin >> first;
cin >> second;
// Afficher les valeurs d'origine
cout << "Original: " << first << " " << second << endl;
// TODO: Utiliser doubleByPointer sur la première valeur (passer l'adresse en utilisant &)
// TODO: Afficher après le double
// TODO: Utiliser tripleByReference sur la deuxième valeur (passer la variable directement)
// TODO: Afficher après le triple
// TODO: Utiliser swapValues pour échanger les deux valeurs (passer les adresses en utilisant &)
// TODO: Afficher après l'échange
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesGénération et compilation en C++Fichiers d’en-tête et fichiers sourceEspaces de noms et portéeIntroduction à la POO en C++Classes et objetsLe pointeur « this »Méthodes (fonctions membres)Attributs (membres de données)Bases des constructeurs et destructeursRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d’instance et statiquesAccesseurs et mutateursFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d’accès de l’héritageOrdre d’appel des constructeurs et destructeursRedéfinition des méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif : hiérarchie des employés10Vue d’ensemble de la STL
Vue d’ensemble et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - fréquence des mots13Modèles de conception, partie 1
Introduction aux modèles de conceptionModèle SingletonFabrique et fabrique abstraiteModèle BuilderModèle ObserverModèle Strategy2Gestion de la mémoire
Mémoire de pile ou de tasPointeurs et référencesMémoire dynamique (new/delete)Pointeurs intelligents en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d’accès en C++Spécificateurs d’accès en profondeurMasquage de l’informationStruct vs classeClasses imbriquées et internesRécapitulatif - Système de gestion des dossiers étudiants8Polymorphisme
Polymorphisme à la compilation vs à l’exécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d’interfaces en C++Conversion dynamique et RTTIRécapitulatif - Calculateur de formes3Constructeurs et destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d’initialisation des constructeursConstructeurs déléguésApprofondissement des destructeursRègle des trois / cinq / zéroRécapitulatif - Classe String6Surcharge des opérateurs
Introduction à la surcharge des opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l’opérateur d’affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif – Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation des templatesTemplates variadiquesBases de SFINAE et des traits de typesRécapitulatif - Conteneur génériqueEntraînez-vous par vous-même : Compilateur C++ en ligne