plus simple de parler d’adresse 0x2dcf0239 que de l’adresse 768541241. Certains langages permettent d’accéder et
donc de voir l’adresse de la zone mémoire d’une variable, tout simplement l’adresse de la variable.
b. Java : des limites qui n’en sont pas
Il va vous falloir légèrement déchanter. Le langage Java utilisé depuis le début de cet ouvrage ne permet pas de
connaître l’adresse de la variable. En fait, la plupart des choses décrites dans les prochaines pages seront en partie
inaccessibles à ce langage. Et parmi ces choses, la possibilité d’accéder à l’adresse mémoire des diverses variables.
La raison est simple : Java est un langage évolué de haut niveau qui n’a pas (et vous avec) à interférer directement
avec la mémoire de l’ordinateur. Dans un programme Java, la mémoire est allouée dynamiquement par la machine
virtuelle qui lui fournit le nécessaire. Le programme Java ne sait pas où sont réellement stockées ses données en
mémoire centrale, c’est la machine virtuelle qui s’occupe de tout. S’il avait été possible de voir une adresse, celleci
aurait été celle au sein de la mémoire réservée par la machine virtuelle, sans pouvoir faire le lien avec la mémoire
physique.
Ce système présente de nombreux avantages. Puisque c’est la machine virtuelle qui gère à votre place la mémoire,
vous n’avez plus à vous soucier de problèmes propres à des langages de bas niveau. En C par exemple, quand vous
créez une chaîne de caractères, c’est en fait un tableau de caractères. Si vous débordez de la taille que vous avez
initialement fixée, vous risquez de graves dysfonctionnements et plantages, car l’espace mémoire situé après est
peutêtre réservé pour une autre variable, ou un bout de programme. C ne vous préviendra pas en cas d’erreur dans
les indices de tableaux non plus. Java vous débarrasse de tous ces problèmes puisqu’il gère tout ça à votre place.
Aucun risque de dépasser quoi que ce soit, aucun risque d’oublier de libérer de la mémoire, etc.
Vous verrez que Java gère très bien pour certaines choses les références, comme cela vous a brièvement été
expliqué dans le chapitre Les tableaux et structures sur les tableaux.
c. Brefs exemples en C
Le langage C est un langage de bas niveau permettant un accès direct au contenu de la mémoire physique, tout au
moins celle réservée pour votre programme. En C vous pouvez afficher l’adresse d’une variable très simplement. Le
bout de code suivant affiche le contenu et l’adresse d’une variable entière longue. Il suffit en C de rajouter le signe
"&" (ET commercial) avant le nom de la variable. La chaîne ésotérique %#xd signifie que le &i est une valeur entière
(d) qui doit être convertie à l’affichage en hexadécimal, avec un préfixe 0x avant (#), le % indiquant de remplacer les
caractères accolés par la variable située en paramètre, dans l’ordre.
long i=123456;
printf("%d à l’adresse %#xd\n",i,&i);
Le résultat varie évidemment d’une machine à l’autre, et n’est jamais le même si on relance le programme plusieurs
fois :
123456 à l’adresse 0xbf9f8420d
C permet aussi de connaître la longueur d’une variable, le nombre d’octets qu’elle utilise, avec la fonction sizeof().
printf("%d à l’adresse %#xd, taille de %d octets\n",i,&i,sizeof(i));
Une variable de type long est codée sur 4 octets sur un ordinateur 32 bits, donc le résultat ne provoque aucune
surprise.
123456 à l’adresse 0xbfa03430d, taille de 4 octets
2. Le pointeur
a. Principe et définition
Que ce soit avec des langages de bas niveau, de haut niveau comme Java ou en algorithmique, il peut être utile de
trouver des moyens de manipuler directement ou indirectement des adresses de variables ou autres éléments
(tableaux, types structurés, objets). En Java ce n’est pas directement possible, vous verrez un autre moyen. Mais la
notion est importante, y compris pour ce langage.
Vous n’aurez que rarement l’occasion, voire jamais, de rentrer une adresse à la main dans une variable. Même en C,
vous partirez généralement d’une adresse déjà définie (celle d’une variable, d’un tableau, etc).
Dans les langages supportant les manipulations d’adresses mémoire, il est courant de manipuler ces adresses au
travers de variables particulières qui ne contiennent non pas une donnée, mais une adresse mémoire. Ce sont des
- 2 -
© ENI Editions - All rigths reserved - Jonifar lina
164
donc de voir l’adresse de la zone mémoire d’une variable, tout simplement l’adresse de la variable.
b. Java : des limites qui n’en sont pas
Il va vous falloir légèrement déchanter. Le langage Java utilisé depuis le début de cet ouvrage ne permet pas de
connaître l’adresse de la variable. En fait, la plupart des choses décrites dans les prochaines pages seront en partie
inaccessibles à ce langage. Et parmi ces choses, la possibilité d’accéder à l’adresse mémoire des diverses variables.
La raison est simple : Java est un langage évolué de haut niveau qui n’a pas (et vous avec) à interférer directement
avec la mémoire de l’ordinateur. Dans un programme Java, la mémoire est allouée dynamiquement par la machine
virtuelle qui lui fournit le nécessaire. Le programme Java ne sait pas où sont réellement stockées ses données en
mémoire centrale, c’est la machine virtuelle qui s’occupe de tout. S’il avait été possible de voir une adresse, celleci
aurait été celle au sein de la mémoire réservée par la machine virtuelle, sans pouvoir faire le lien avec la mémoire
physique.
Ce système présente de nombreux avantages. Puisque c’est la machine virtuelle qui gère à votre place la mémoire,
vous n’avez plus à vous soucier de problèmes propres à des langages de bas niveau. En C par exemple, quand vous
créez une chaîne de caractères, c’est en fait un tableau de caractères. Si vous débordez de la taille que vous avez
initialement fixée, vous risquez de graves dysfonctionnements et plantages, car l’espace mémoire situé après est
peutêtre réservé pour une autre variable, ou un bout de programme. C ne vous préviendra pas en cas d’erreur dans
les indices de tableaux non plus. Java vous débarrasse de tous ces problèmes puisqu’il gère tout ça à votre place.
Aucun risque de dépasser quoi que ce soit, aucun risque d’oublier de libérer de la mémoire, etc.
Vous verrez que Java gère très bien pour certaines choses les références, comme cela vous a brièvement été
expliqué dans le chapitre Les tableaux et structures sur les tableaux.
c. Brefs exemples en C
Le langage C est un langage de bas niveau permettant un accès direct au contenu de la mémoire physique, tout au
moins celle réservée pour votre programme. En C vous pouvez afficher l’adresse d’une variable très simplement. Le
bout de code suivant affiche le contenu et l’adresse d’une variable entière longue. Il suffit en C de rajouter le signe
"&" (ET commercial) avant le nom de la variable. La chaîne ésotérique %#xd signifie que le &i est une valeur entière
(d) qui doit être convertie à l’affichage en hexadécimal, avec un préfixe 0x avant (#), le % indiquant de remplacer les
caractères accolés par la variable située en paramètre, dans l’ordre.
long i=123456;
printf("%d à l’adresse %#xd\n",i,&i);
Le résultat varie évidemment d’une machine à l’autre, et n’est jamais le même si on relance le programme plusieurs
fois :
123456 à l’adresse 0xbf9f8420d
C permet aussi de connaître la longueur d’une variable, le nombre d’octets qu’elle utilise, avec la fonction sizeof().
printf("%d à l’adresse %#xd, taille de %d octets\n",i,&i,sizeof(i));
Une variable de type long est codée sur 4 octets sur un ordinateur 32 bits, donc le résultat ne provoque aucune
surprise.
123456 à l’adresse 0xbfa03430d, taille de 4 octets
2. Le pointeur
a. Principe et définition
Que ce soit avec des langages de bas niveau, de haut niveau comme Java ou en algorithmique, il peut être utile de
trouver des moyens de manipuler directement ou indirectement des adresses de variables ou autres éléments
(tableaux, types structurés, objets). En Java ce n’est pas directement possible, vous verrez un autre moyen. Mais la
notion est importante, y compris pour ce langage.
Vous n’aurez que rarement l’occasion, voire jamais, de rentrer une adresse à la main dans une variable. Même en C,
vous partirez généralement d’une adresse déjà définie (celle d’une variable, d’un tableau, etc).
Dans les langages supportant les manipulations d’adresses mémoire, il est courant de manipuler ces adresses au
travers de variables particulières qui ne contiennent non pas une donnée, mais une adresse mémoire. Ce sont des
- 2 -
© ENI Editions - All rigths reserved - Jonifar lina
164
