Pointeurs et mémoire

Pointeurs et adresses en C et C++

Dans cette leçon, vous allez stocker l'adresse d'une variable dans un pointeur, accéder à la valeur par ce pointeur et modifier la variable d'origine.

Introduction

Un pointeur (pointer) est une variable qui contient l'adresse mémoire d'une autre variable. L'opérateur & donne l'adresse d'une variable, et l'opérateur * (déréférencement) accède à la valeur située à l'adresse pointée. Les pointeurs sont l'une des notions les plus importantes du C et du C++.

Points importants

  • Un pointeur ne doit pointer que vers un objet qui existe encore, du bon type, ou valoir null.
  • Chaque zone mémoire allouée doit être libérée exactement une fois.
  • Indiquez clairement quelle fonction possède la mémoire (ownership) et quelles données sont seulement lues (const).

Exemples de code C et C++

C
Exécuter →
main.c
#include <stdio.h>

int main(void) {
    int score = 70;
    int *score_ptr = &score;
    *score_ptr += 5;
    printf("score=%d same-address=%s\n", score,
           score_ptr == &score ? "yes" : "no");
    return 0;
}
Résultat de l’exécution
score=75 same-address=yes
C++
Exécuter →
main.cpp
#include <iostream>

int main() {
    int score = 70;
    int* score_ptr = &score;
    *score_ptr += 5;
    std::cout << "score=" << score << " same-address="
              << std::boolalpha << (score_ptr == &score) << '\n';
}
Résultat de l’exécution
score=75 same-address=true

Comparaison entre C et C++

Le pointeur score_ptr contient l'adresse de score, donc *score_ptr += 5 ajoute en réalité 5 à la variable score elle-même, qui passe de 70 à 75. La comparaison score_ptr == &score confirme que les deux adresses sont identiques. C++ utilise encore des pointeurs bruts (raw pointer) quand il faut seulement accéder aux données sans gérer la mémoire, mais préfère les références quand la variable ne doit jamais être vide.

C

La possession et la libération de la mémoire reposent entièrement sur le programmeur.

C++

Les conteneurs et RAII libèrent automatiquement les ressources quand l'objet arrive en fin de vie.

Exercices d'approfondissement

Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.

  • Testez avec des pointeurs nuls et des échecs d'allocation mémoire.
  • Exécutez le programme avec AddressSanitizer et UndefinedBehaviorSanitizer pour détecter les erreurs mémoire.
  • Indiquez clairement quel pointeur possède la mémoire et lequel sert seulement à lire.

S'entraîner avec un défi

Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.

Tous les défis