LPS : Linux : principes et programmation Système
Autres références Cnam Liban et cofares.netThis project is maintained by ISSAE
Une variable possède un nom (t), type (T), une valeur (v) et une adresse en mémoire adresseDeValeurDuNom
T t = v;
On pourrait la représenté sous la forme de (clé, valeurs) (n:T,v) (nom:Type,valeur)
L’environnement serait l’ensemble des variables (ie l’ensemble des clé/valeur)
Nous pouvons aussi considérer que l’adresse mémoire (référence) est aussi la clé de la variable on retrouve la variable t de 2 manières a partir de son nom ou a partir de son adresse
(nom:Type, valeurDuNom) ou (adresseDeValeurDuNom, valeurDuNom)
en pseudo syntaxe C
(T n, v) (&n, v) ou &n indique l’adresse de la variable n.
n est une étiquette, &n est un nombre qui tous deux mêne a la même valeur (case mémoire)
2:
T *a = &n
ceci indique que la valeur de l’étiquette a est l’adresse de la variable n
(a:T, valeurDeA) d’après (2) valeurDeA est adresseDeValeurDeNom
étiquette : (var, valeurDeVar)
par référence : (&var, *(&var))
3:
int x=10; // [{x:10}] et supposons que l'adresse de x serait 1001 . cest a dire &x==1001
int *p;
p=&x; //sémantique de l'affectation : mettre dans p la valeur &x => [{p:1001},{x:10}]
*p=20; //Mettre dans la mémoires référencé par p 20 => [{p:1001},{x:20}] remarque p nest pas modifié cest *p quí l'est (en quelques sorte *(&x)
Chaque zone possède 2 clés sont adresse et son nom (label) et une valeur dont la taille dépent du type
Ont pourrait par exemple modélisé ceci par 2 tableux
MEM[adresse]=valeur //ceci représenterait la mémoire
ADRESSE[nom]=adresse //ceci représenterait la table de symbole geŕé par le compilateur
ont peut réaliser 2 opération de base sur les données en mémoire : lire et ecrire
lire(nom) : donne le résultat MEM[ADRESSE[NOM]]
ecrire(nom,valeur) : réalise MEM[ADRESSE[nom]]=valeur
int x=10;
Trouver une adresse pouvant contenir en int soit ADRESSEX cette adresse et y ecrire 10 MEM[ADRESSEX]=10 et ADRESSE[x]=ADRESSEX
int *p=&x;
Trouver une adresse pouvant contenir une référence de int (une adresse) soit ADRESSEP cette adresse et y ecrire &x MEM[ADRESSEP]=ADRESSE[x] (cad ADRESSEX) et ADRESSE[p]=ADRESSEP
*p=20
MEM[MEM[ADRESSE[p]]]=20 cad MEM[MEM[ADRESSEP]]=20 cad MEM[ADRESSE[x]]=20 cad MEM[ADRESSEX]=20