Cours 11.1. Introduction aux pointeurs en C

Définition

En C, un pointeur est une variable qui contient une adresse mémoire, généralement l'adresse d'une autre variable, d'un tableau ou d'une fonction. Les pointeurs présentent plusieurs avantages :

La RAM

RAM signifie Random Access Mémory (mémoire à accès aléatoire). Il ne s'agit évidemment pas d'avoir des accès aléatoires à la mémoire, mais de pouvoir accéder directement à n'importe quelle section de la mémoire. Une traduction plus judicieuse serait mémoire à accès direct par opposition à mémoire à accès séquentiel (sequential access memory).

Une mémoire à accès séquentiel nécessite de parcourir le debut de la mémoire jusqu'à l'élément désiré. L'exemple typique est l'enregistrement sur bandes magnétiques :

Mémoire sur bande magnétique

Pour permettre un accès direct à la RAM, la solution technique retenue est d'associer à chaque octet de la mémoire une adresse. Les adresses sont généralement représentées sous leur forme hexadécimale.

Exemple

Considérons le code suivant qui permet d'afficher les adresses des variables i, f et s :

int i=0;
float f;
char s[]="Hello";

printf ("Adresse de s : %p\n", &s);
printf ("Adresse de f : %p\n", &f);
printf ("Adresse de i : %p\n", &i);

Notons au passage que le code de format %p permet d'afficher u pointeur.

Voici une illustration de l'allocation mémoire pour ce programme (notons que chaque exécution peut produire des adresses différentes) :

Adresse de s : 0x7fff21e8dc3e
Adresse de f : 0x7fff21e8dc44
Adresse de i : 0x7fff21e8dc48

Au moment de l'exécution du programme (et non de la compilation), un espace mémoire est allouée pour chaque variable. Cet espace mémoire sera constitué d'un ou plusieurs octets. Chaque variable sera associée à une adresse qui va permettre un accès direct. Voici une représentation de la mémoire :

Allocation mémoire et représentation des pointeurs en C

On distingue l'allocation de chaque variable dans la mémoire. Les adresses en gras représentent l'adresse de base (celle du pointeur).

Sur cet exemple les variables sont regroupées ensemble. Cette stratégie (qui n'est pas systématique) permet d'économiser la mémoire. Une analogie serait la minimisation des chutes dans la découpe d'un tissus.

Exercice

Exercice 1

En vous inspirant de l'exemple ci-dessus, écrire un programme qui déclare un tableau de 8 caractères et affiche l'adresse de chaque cellule du tableau :

Adresse de t[0] : 0x7ffeb0c9bc60
Adresse de t[1] : 0x7ffeb0c9bc61
Adresse de t[2] : 0x7ffeb0c9bc62
Adresse de t[3] : 0x7ffeb0c9bc63
Adresse de t[4] : 0x7ffeb0c9bc64
Adresse de t[5] : 0x7ffeb0c9bc65
Adresse de t[6] : 0x7ffeb0c9bc66
Adresse de t[7] : 0x7ffeb0c9bc67

Exercice 2

En vous inspirant de l'exemple ci-dessus, écrire un programme qui déclare un tableau de 8 variables de type double et affiche l'adresse de chaque cellule du tableau. Les cellules du tableau doivent être consécutives, mais séparées de 8 octets :

Adresse de t[0] : 0x7ffed37d4f70
Adresse de t[1] : 0x7ffed37d4f78
Adresse de t[2] : 0x7ffed37d4f80
Adresse de t[3] : 0x7ffed37d4f88
Adresse de t[4] : 0x7ffed37d4f90
Adresse de t[5] : 0x7ffed37d4f98
Adresse de t[6] : 0x7ffed37d4fa0
Adresse de t[7] : 0x7ffed37d4fa8

Quiz

Que signifie RAM ?

Vérifier Bravo ! La mémoire vive (RAM) est une forme de mémoire informatique qui peut être lue et modifiée dans n'importe quel ordre. Essaie encore ...

En informatique, que peut représenter un pointeur ?

Vérifier Bravo ! De manière générale, un pointeur est l’adresse mémoire d'un autre élément. Essaie encore ...

Quand la mémoire est allouée ?

Vérifier Bravo ! La mémoire est allouée à la déclaration des variables, qu'elles soient locales ou globales. Essaie encore ...

Voir aussi


Dernière mise à jour : 29/11/2022