Les Pointeurs, Tableaux et Vecteurs en C++

Les Pointeurs, Tableaux et Vecteurs en C++

Amine Abidi - Lead Software Engineer C++/Qt - Associé PointerLab

Publié par Amine Abidi - Lead Software Engineer C++/Qt - Associé 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

  • push_back(valeur) : Ajoute un élément.
  • size() : Retourne la taille.
  • at(index) : Accède à un élément en vérifiant les limites.
#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.


À propos de pointerlab

Chez pointerlab, nous mettons notre expertise unique en C, C++, Qt, OpenGL et bien d'autres technologies au service des entreprises. Que vous ayez besoin de solutions sur mesure pour la simulation 3D, les systèmes embarqués, ou des projets innovants dans des secteurs comme l’aéronautique, le médical ou l’énergie, nous vous accompagnons dans le développement de logiciels métiers.

Vous avez un projet ? Contactez-nous dès maintenant pour discuter de vos besoins et découvrir comment nous pouvons collaborer.

Vous êtes ingénieur logiciel C++ ? Rejoignez-nous ! Découvrez nos opportunités ici et contribuez à façonner l’avenir des logiciels d'excellence.

Rejoignez la communauté C++ France sur Discord !

Développez votre réseau et boostez votre carrière avec la communauté C++ France