Les Pointeurs en C

Introduction aux Pointeurs

Un pointeur est une variable dont la valeur est une adresse mémoire, souvent représentant l'emplacement d'une autre variable. Les pointeurs sont très utiles car ils permettent de créer et de manipuler efficacement des structures de données complexes.

Comprendre les Pointeurs

Les données sont sauvegardées dans la mémoire d'un ordinateur. Une variable représente un emplacement précis dans cette mémoire et se compose de trois éléments principaux :

  1. Un identifiant (nom)
  2. Une valeur
  3. Une adresse

L'adresse est un nombre indiquant où se trouve une variable dans la mémoire. Si l'on considère les variables comme des boîtes sur une étagère, chaque boîte a une étiquette (l'identifiant), un numéro de série unique (l'adresse), et possiblement un contenu (la valeur). Ainsi, un pointeur pourrait être imaginé comme une boîte contenant le numéro de série d'une autre boîte.

Déclaration et Assignation d'un Pointeur

Déclarer un pointeur est similaire à déclarer une variable normale : il faut indiquer son type, son identifiant et sa valeur. Cependant, un astérisque * est ajouté avant l'identifiant.

int *nom_du_pointeur;

Pour récupérer l'adresse d'une variable, on utilise le symbole esperluette & devant son identifiant, ce qui est connu sous le nom d'opérateur d'adresse.

int annee = 1986;
int *pointeur_vers_annee = &annee;

Dans cet exemple, on pourrait lire la déclaration de gauche comme : "pointeur_vers_annee est un pointeur sur un entier". Si l'on imprime la valeur de annee, on obtiendra "1986". En revanche, si l'on imprime la valeur de pointeur_vers_annee, l'affichage serait de type 0x2aba1c0cf890, représentant une adresse.

Utilisation de l'Opérateur de Déréférencement

L'opérateur de déréférencement (*), permet d'accéder à la valeur de la variable pointée par le pointeur.

int annee = 1986;         // Valeur de annee : 1986
int *pointeur_vers_annee = &annee; // Valeur de pointeur_vers_annee : 0x2aba1c0cf890
int autre_annee = *(pointeur_vers_annee) - 33; // Valeur de autre_annee : 1953
*(pointeur_vers_annee) = 2019;       // Cela change la valeur de annee à 2019

Fonctions et Pointeurs

Tout comme d'autres types de données, les pointeurs peuvent être passés et retournés par des fonctions. Un exemple utile serait de "retourner" deux valeurs d'une fonction.

#include 
#include 

int diviser(int a, int b, bool *d) {
    int c = a / b;
    if (c * b == a) {
        *(d) = true;
    } else {
        *(d) = false;
    }
    return c;
}

int main() {
    int numerateur = 10;
    int denominateur = 5;
    bool divisible;
    int resultat = diviser(numerateur, denominateur, &divisible);
    printf("%d", resultat);
    return 0;
}

Dans cet exemple, la fonction diviser() retourne le résultat de a / b et modifie la variable pointée par d pour indiquer si a est divisible par b. En appelant cette fonction dans le main, nous obtenons un résultat de 2, la variable divisible étant mise à true.