Pointeurs et mémoire

Les tableaux multidimensionnels en C et C++

Dans cette leçon, vous allez parcourir une matrice à deux dimensions et calculer la somme des éléments de chaque ligne.

Introduction

Un tableau à deux dimensions s'imagine comme un tableau de lignes et de colonnes. En C comme en C++, il est stocké de façon continue en mémoire, ligne par ligne (row-major) : toute la première ligne d'abord, puis la deuxième, et ainsi de suite.

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

Voir comment ça marche

Pointez une case pour voir sa ligne, sa colonne et sa place en mémoire, où toutes les lignes sont rangées les unes après les autres.

Exemples de code C et C++

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

int main(void) {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int row = 0; row < 2; ++row) {
        int total = 0;
        for (int column = 0; column < 3; ++column) total += matrix[row][column];
        printf("row %d=%d\n", row, total);
    }
    return 0;
}
Résultat de l’exécution
row 0=6
row 1=15
C++
Exécuter →
main.cpp
#include <array>
#include <iostream>

int main() {
    std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
    for (std::size_t row = 0; row < matrix.size(); ++row) {
        int total = 0;
        for (int value : matrix[row]) total += value;
        std::cout << "row " << row << '=' << total << '\n';
    }
}
Résultat de l’exécution
row 0=6
row 1=15

Comparaison entre C et C++

Deux boucles imbriquées parcourent la matrice : la boucle extérieure passe sur chaque ligne, la boucle intérieure additionne les éléments de cette ligne dans la variable total. En C, quand on passe un tableau à deux dimensions à une fonction, il faut indiquer la taille de toutes les dimensions sauf la première. En C++, std::array garde la taille dans le type lui-même et offre la méthode at(), qui vérifie que l'indice est valide.

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