Programmer en C++
Les pointeurs

1. Notion d'adresse

la mémoire d'un ordinateur est constituée de petites cases portant chacune un numéro. Ce numéro est appelé l'adresse de la mémoire. Chaque petite case permet de stocker un octet (nombre constitué de 8 bits).

Dans l'exemple ci-dessus, nous avons placé la donnée hexadécimale FD (1111 1101 en binaire) à l'adresse 5B. Une adresse permet donc de connaitre l'emplacement en mémoire où nous stockons une donnée.

Analysons de suite un exemple :

#include <iostream>

using namespace std;

int main()
{
    int a = 20;
    cout << "La valeur de a est de " << a;
    cout << "L'adresse de a est " << &a;
    return 0;
}
La valeur de a est de 20.
L'adresse de a est 0x6dfefc

Process returned 0 (0x0)   execution time : 0.056 s
Press any key to continue.

Dans ce programme nous avons défini un entier : la variable "a" que nous avons actualisé à la valeur 20. Observons maintenant la dernière ligne "cout" de ce programme. En plaçant le symbole & devant le nom de notre variable, ce n'est plus sa valeur qui s'affiche, mais l'adresse ou l'ordinateur a stocké cette variable.

En résumé,

& devant le nom d'une variable, est interprêté par "adresse de".

Notons que c'est l'ordinateur qui choisit l'adresse de stockage et non l'utilisateur. En effet, imposer une adresse, reviendrait à écrire n'importe où dans l'ordinateur, et risquer de provoquer un plantage de la machine.

2. Les pointeurs

Le pointeur est une variable particulière. Elle contient l'adresse d'une autre variable.
La déclaration d'un pointeur se fait comme pour une variable ordinaire en précisant le type (int, float, ...), puis en ajoutant le symbole * devant le nom de cette variable.

int *pointeur = 0;

Important : Pour éviter qu'un pointeur s'initialise avec une valeur aléatoire, il est prudent de le déclarer avec une valeur nulle.
Analysons maintenant un programme utilisant un pointeur :

#include <iostream>

using namespace std;

int main()
{
    int a = 20;
    int *ptr = 0;
    ptr = &a;
    cout << "La valeur de a est de " << a;
    cout << "La valeur du pointeur est " << ptr;
    return 0;
}
La valeur de a est de 20.
La valeur du pointeur est 0x6dfef8

Process returned 0 (0x0)   execution time : 0.053 s
Press any key to continue.

Cet exemple montre qu'à la fin du programme, notre pointeur contient bien l'adresse de a.

Notez qu'après avoir initialisé le pointeur, le symbole * n'apparait plus.

Un pointeur permet de désigner l'adresse d'une variable.

3. Déréférencement d'un pointeur

Nous venons de voir que lorsque nous utilisons un pointeur, il est écrit sans le * devant. Que se passe-t-il si nous reécrivons ce symbole ?
Voyons un exemple :

#include <iostream>

using namespace std;

int main()
{
    int a = 20;
    int *ptr = &a;
    cout << "Adresse de a : " << ptr << endl;
    cout << "Valeur de a : " << *ptr << endl;
    return 0;
}
Adresse de a : 0x6dfef8
Valeur de a : 20

Process returned 0 (0x0)   execution time : 0.049 s
Press any key to continue.

C'est ce que nous appelons un déréférencement du pointeur. Il ne désignera plus l'adresse, mais la valeur de la variable qu'il pointait.
"endl" est une instruction de saut à la ligne suivante.

Un déréférencement de pointeur permet de lire la valeur de la variable pointée, au lieu de son adresse.