La mémoire, une question d'adresse 




Rappel des faits



Petit flash-back. Vous souvenez-vous du chapitre sur les variables ?

Quelle que soit la réponse, je vous recommande très vivement d'aller relire la première partie de ce chapitre, intitulée « Une affaire de mémoire ». Il y avait un schéma très important que je vous propose ici à nouveau (fig. suivante).



C'est un peu comme ça qu'on peut représenter la mémoire vive (RAM) de votre ordinateur.

Il faut lire ce schéma ligne par ligne. La première ligne représente la « cellule » du tout début de la mémoire vive. Chaque cellule a un numéro, c'est son adresse (le vocabulaire est très important, retenez-le). La mémoire comporte un grand nombre d'adresses, commençant à l'adresse numéro 0 et se terminant à l'adresse numéro (insérez un très grand nombre ici). Le nombre d'adresses disponibles dépend en fait de la quantité de mémoire dont dispose votre ordinateur.

À chaque adresse, on peut stocker un nombre. Un et UN SEUL nombre. On ne peut pas stocker deux nombres par adresse.

Votre mémoire n'est faite que pour stocker des nombres. Elle ne peut stocker ni lettres ni phrases. Pour contourner ce problème, on a inventé une table qui fait la liaison entre les nombres et les lettres. Cette table dit par exemple : « Le nombre 89 représente la lettre Y ». Nous reviendrons dans un prochain chapitre sur la gestion des caractères ; pour l'instant, nous nous concentrons sur le fonctionnement de la mémoire.

Adresse et valeur



Quand vous créez une variable age de type int par exemple, en tapant ça :

int age = 10;



… votre programme demande au système d'exploitation (Windows, par exemple) la permission d'utiliser un peu de mémoire. Le système d'exploitation répond en indiquant à quelle adresse en mémoire il vous laisse le droit d'inscrire votre nombre.

C'est d'ailleurs justement là un des rôles principaux d'un système d'exploitation : on dit qu'il alloue de la mémoire aux programmes. C'est un peu lui le chef, il contrôle chaque programme et vérifie que ce dernier a l'autorisation de se servir de la mémoire à l'endroit où il le fait.

C'est d'ailleurs là la cause n° 1 de plantage des programmes : si votre programme essaie d'accéder à une zone de la mémoire qui ne lui appartient pas, le système d'exploitation (abrégez « OS ») le refuse et coupe brutalement le programme en guise de punition (« C'est qui le chef ici ? »). L'utilisateur, lui, voit une jolie boîte de dialogue du type « Ce programme va être arrêté parce qu'il a effectué une opération non conforme ».



Revenons à notre variable age. La valeur 10 a été inscrite quelque part en mémoire, disons par exemple à l'adresse n° 4655.
Ce qu'il se passe (et c'est le rôle du compilateur), c'est que le mot age dans votre programme est remplacé par l'adresse 4655 à l'exécution. Cela fait que, à chaque fois que vous avez tapé le mot age dans votre code source, il est remplacé par 4655, et votre ordinateur voit ainsi à quelle adresse il doit aller chercher en mémoire ! Du coup, l'ordinateur se rend en mémoire à l'adresse 4655 et répond fièrement : « La variable age vaut 10 ! ».

On sait donc comment récupérer la valeur de la variable : il suffit tout bêtement de taper age dans son code source. Si on veut afficher l'âge, on peut utiliser la fonction printf :

printf("La variable age vaut : %d", age);



Résultat à l'écran :

La variable age vaut : 10


Rien de bien nouveau jusque-là.

Le scoop du jour



On sait afficher la valeur de la variable, mais saviez-vous que l'on peut aussi afficher l'adresse correspondante ?

Pour afficher l'adresse de la variable, on doit utiliser le symbole %p (le p du mot « pointeur ») dans le printf. En outre, on doit envoyer à la fonction printf non pas la variable age, mais son adresse… Et pour faire cela, vous devez mettre le symbole & devant la variable age, comme je vous avais demandé de le faire pour les scanf, il y a quelque temps, sans vous expliquer pourquoi.

Tapez donc :

printf("L'adresse de la variable age est : %p", &age);



Résultat :

Code : Console


L'adresse de la variable age est : 0023FF74




Ce que vous voyez là est l'adresse de la variable age au moment où j'ai lancé le programme sur mon ordinateur. Oui, oui, 0023FF74 est un nombre, il est simplement écrit dans le système hexadécimal, au lieu du système décimal dont nous avons l'habitude. Si vous remplacez %p par %d, vous obtiendrez un nombre décimal que vous connaissez. Si vous réfléchissez un peu, vous comprendrez qu'il s'agit ici d'un ordinateur avec un système d'exploitation en 32 bits.

Si vous exécutez ce programme sur votre ordinateur, l'adresse sera très certainement différente. Tout dépend de la place que vous avez en mémoire, des programmes que vous avez lancés, etc. Il est totalement impossible de prédire à quelle adresse la variable sera stockée chez vous. Si vous lancez votre programme plusieurs fois d'affilée, il se peut que l'adresse soit identique, la mémoire n'ayant pas beaucoup changé entre temps. Si par contre vous redémarrez votre ordinateur, vous aurez sûrement une valeur différente.



Où je veux en venir avec tout ça ? Eh bien en fait, je veux vous faire retenir ceci :

  • age : désigne la valeur de la variable ;
  • &age : désigne l'adresse de la variable.

Avec age, l'ordinateur va lire la valeur de la variable en mémoire et vous renvoie cette valeur. Avec &age, votre ordinateur vous dit en revanche à quelle adresse se trouve la variable.

Créé avec HelpNDoc Personal Edition: Générateur de documentations PDF gratuit