Les Pointeurs, Tableaux et Vecteurs en C++

Les Pointeurs, Tableaux et Vecteurs en C++

Amine Abidi - Lead Software Engineer C++/Qt - Co-fondateur PointerLab

Publié par Amine Abidi - Lead Software Engineer C++/Qt - Co-fondateur PointerLab

Introduction

Les pointeurs, tableaux et vecteurs sont des concepts essentiels en C++ pour manipuler et organiser des données. Chacun de ces concepts joue un rôle spécifique dans la gestion de la mémoire et le traitement des données. Bien les comprendre est crucial pour développer des programmes performants et modulaires.

Dans cet article, nous aborderons :

  • Les pointeurs : définition, manipulation et usage avancé.
  • Les tableaux : déclarations, itérations et relation avec les pointeurs.
  • Les vecteurs : utilisation de la bibliothèque standard (STL). Pour en savoir plus sur les conteneurs et algorithmes de la STL, consultez notre article : Introduction à la STL en C++.
  • Les différences et complémentarités entre tableaux et vecteurs.
  • Des exemples pratiques pour chaque concept.

1. Les Pointeurs

Un pointeur est une variable qui stocke l’adresse mémoire d’une autre variable. Ils sont utilisés pour manipuler la mémoire, passer des variables par référence ou créer des structures dynamiques.

Si vous souhaitez en savoir plus sur les différences entre les références et les pointeurs, ainsi que sur leurs cas d'utilisation respectifs, consultez notre article complet qui les compare en détail : Références vs Pointeurs.

a. Déclaration et Initialisation

type* nom_pointeur;

Exemple :

#include <iostream>

int main() {
    int nombre = 42;
    int* pointeur = &nombre;

    std::cout << "Valeur de nombre : " << nombre << std::endl;
    std::cout << "Adresse de nombre : " << pointeur << std::endl;
    std::cout << "Valeur pointée : " << *pointeur << std::endl;

    return 0;
}

b. Déclaration et Initialisation

Les pointeurs permettent de modifier directement la valeur d'une variable.

#include <iostream>

void modifier(int* p) {
    *p = 100;
}

int main() {
    int nombre = 42;
    modifier(&nombre);

    std::cout << "Valeur modifiée : " << nombre << std::endl;
    return 0;
}

c. Mémoire Dynamique

Les pointeurs sont utilisés pour allouer de la mémoire dynamiquement avec new et la libérer avec delete.

#include <iostream>

int main() {
    int* nombre = new int; // Allocation dynamique
    *nombre = 42;

    std::cout << "Valeur : " << *nombre << std::endl;

    delete nombre; // Libération de la mémoire
    return 0;
}

2. Les Tableaux

Un tableau est une structure de données qui contient une collection d'éléments du même type. La taille d'un tableau est fixe et doit être connue à la compilation.

a. Déclaration et Initialisation

type nom_tableau[taille];

Exemple :

#include <iostream>

int main() {
    int nombres[5] = {1, 2, 3, 4, 5};
    std::cout << "Premier élément : " << nombres[0] << std::endl;
    std::cout << "Dernier élément : " << nombres[4] << std::endl;

    return 0;
}

b. Parcours d’un Tableau

Utilisez une boucle pour parcourir et afficher les éléments.

#include <iostream>

int main() {
    int nombres[5] = {1, 2, 3, 4, 5};

    for (int i = 0; i < 5; i++) {
        std::cout << "Élément " << i << " : " << nombres[i] << std::endl;
    }

    return 0;
}

c. Tableaux Multidimensionnels

Un tableau peut contenir plusieurs dimensions pour organiser des données en grilles ou matrices.

#include <iostream>

int main() {
    int matrice[2][3] = {{1, 2, 3}, {4, 5, 6}};

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            std::cout << "Élément [" << i << "][" << j << "] : " << matrice[i][j] << std::endl;
        }
    }

    return 0;
}

d. Relation avec les Pointeurs

Le nom d’un tableau est un pointeur vers le premier élément.

#include <iostream>

int main() {
    int nombres[5] = {1, 2, 3, 4, 5};
    int* pointeur = nombres;

    for (int i = 0; i < 5; i++) {
        std::cout << "Élément " << i << " : " << *(pointeur + i) << std::endl;
    }

    return 0;
}

3. Les Vecteurs

Un vecteur est une structure de données dynamique de la bibliothèque standard STL. Contrairement aux tableaux, sa taille peut changer dynamiquement.


a. Déclaration et Initialisation

Incluez pour utiliser les vecteurs.

#include <iostream>
#include <vector>

int main() {
    std::vector<int> nombres = {1, 2, 3, 4, 5};
    nombres.push_back(6); // Ajouter un élément

    for (int i = 0; i < nombres.size(); i++) {
        std::cout << "Élément " << i << " : " << nombres[i] << std::endl;
    }

    return 0;
}

b. Méthodes Utiles

Les vecteurs offrent plusieurs fonctions intégrées pour manipuler les données efficacement, comme push_back() pour ajouter un élément ou size() pour obtenir la taille. Pour des opérations plus avancées, comme insérer des éléments à une position spécifique, consultez notre article dédié : Vector insert() en C++.

#include <iostream>
#include <vector>

int main() {
    std::vector<int> nombres;

    for (int i = 1; i <= 5; i++) {
        nombres.push_back(i);
    }

    for (int i = 0; i < nombres.size(); i++) {
        std::cout << "Élément " << i << " : " << nombres.at(i) << std::endl;
    }

    return 0;
}

c. Parcours avec Boucle for-each

Les vecteurs peuvent être parcourus avec une boucle for-each.

#include <iostream>
#include <vector>

int main() {
    std::vector<int> nombres = {1, 2, 3, 4, 5};

    for (int nombre : nombres) {
        std::cout << "Nombre : " << nombre << std::endl;
    }

    return 0;
}

4. Tableaux vs Vecteurs

Caractéristique Tableau Vecteur
Taille Fixe Dynamique
Mémoire Allouée statiquement Allouée dynamiquement
Sécurité d'accès Non Oui (at)
Performance Plus rapide Plus flexible

5. Bonnes Pratiques

  • Préférez les vecteurs aux tableaux : Les vecteurs offrent plus de flexibilité et de sécurité.
  • Initialisez toujours les pointeurs : Utilisez nullptr pour éviter les pointeurs sauvages.
  • Libérez la mémoire dynamique : N'oubliez pas d'utiliser delete pour les allocations avec new.

5. Conclusion

Les pointeurs, tableaux et vecteurs sont des outils indispensables en C++. Ils permettent de manipuler efficacement les données, tout en offrant des choix adaptés à différents besoins. Tandis que les tableaux et pointeurs offrent un contrôle fin sur la mémoire, les vecteurs simplifient la gestion des collections dynamiques.

Dans le prochain article, nous aborderons la gestion de la mémoire dynamique en C++, où nous explorerons les concepts de new, delete et les smart pointers pour un code plus sûr et moderne.


Découvrez l'ensemble de notre blog sur le C++

Rejoignez la communauté C++ 🇫🇷 sur Discord !

Un espace convivial pour échanger et apprendre ensemble.