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 :
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 :
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.
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 :
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.
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
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
Que signifie RAM ?
En informatique, que peut représenter un pointeur ?
Quand la mémoire est allouée ?