Opérateur de référencement
Le& est l’opérateur de référencement, il retourne l’adresse en mémoire (référence) de la variable dont le nom le suit. &var donne l’adresse en mémoire de la variable var. Cette adresse peut être utilisée pour affecter un pointeur (à la condition que le pointeur soit d’un type compatible avec l’adresse de la variable).
Comme le montre l’extrait de l’exemple : pint = &var;
Opérateur de déréférencement ou indirection
Le * est l’opérateur d’indirection. Il permet d’accéder à une variable à partir d’une adresse (le plus souvent en utilisant la valeur contenue dans un pointeur). Dans notre programme 5.1, *&var donne la valeur 10, de même que *pint, puisque pint a été initialisé avec l’adresse de var.
Utilisation des & et *
Prenons un exemple d’utilisation des opérateurs d’adresse et d’indirection en supposant que l’espace mémoire associé aux données du programme débute en 0x20000 et que la taille d’un entier est de quatre octets. Nous supposons de plus que la taille d’un pointeur est elle-aussi de quatre octets.
La figure 5.1 montre l’espace mémoire associé aux définitions du programme 5.1, et en particulier, l’association entre le pointeur pint et la variable var.
L’instruction pint = &nvar; est traduite dans la figure 5.2.
Une fois cette instruction réalisée, l’expression *pint = var – 2 se traduit au niveau du process-seur par les opérations suivantes :
1. mettre la valeur de var dans le registre R0
(R0 ← @ 0x20000, soit R0 ← 10) ;
2. soustraire 2 à cette valeur (R0 ← R0 -2,
soit R0 ← 8) ;
3. mettre la valeur de pint dans le registre A0
(A0 ← @ 0x20004, soit A0 ← 0x20008) ;
4. mettre la valeur qui est dans R0 à l’adresse contenue dans le registre A0, c’est-à-dire dans var (@ A0 ← R0, soit 0x20008 ← 8).
Nous reparlerons des relations entre les pointeurs et les variables dans le chapitre 10 sur les tableaux et les pointeurs.
Opérateurs d’incrémentation et de décrémentation
Les opérateurs — et ++ permettent de décrémenter et d’incrémenter des variables de type entier. Dans une première approche, nous pouvons considérer que :
– var– : est équivalent à var = var – 1, ce qui implique en partant d’une variable var ayant une valeur de 8 que cette variable contient la valeur 7 une fois l’expression calculée à l’exécution ;
– var++ : est équivalent à var = var + 1, ce qui implique en partant de var ayant une valeur de 8 que cette variable contient la valeur 9 à la fin de l’exécution de l’expression.
Il est possible d’utiliser les opérateurs un-aires d’incrémentation et de décrémentation derrière la variable (postfixé) ou devant celle-ci (préfixé). Ce qui permet de post-incrémenter, de pré-incrémenter, de
post-décrémenter ou de pré-décrémenter.
Lorsque l’opérateur est préfixé, l’opération est appliquée avant que la valeur correspondant à l’opération ne soit calculée. Dans le cas où l’opération est post-fixée, la valeur de la variable avant l’opération est utilisée pour les autres calculs et ensuite l’opération est appliquée.
Prenons comme exemple, deux entiers i et j, et initialisons ces deux variables avec la valeur 0.
int i=0, j=0;
Si nous écrivons j = ++i, c’est une pré-incrémentation de la variable i. Cela signifie incrémenter i de 1 puis mettre la valeur de i dans j. À la fin de cette opération i vaut 1 et j vaut 1. En anticipant sur l’opérateur de succession 5.2.5, nous pouvons considérer cette instruction comme équivalente à :
i = i+1 ,
j = i
Si au contraire, nous écrivons j = i++, cela signifie mettre la valeur de i dans j puis incrémenter i de 1. En partant des mêmes valeurs, i valant 0 et j valant 0, à la fin de cette instruction i vaut 1 et j vaut 0. Cette opération est équivalente à :
j=i,
i = i+1,
j
Langage C généralités sur la syntaxe (628 KO) (Cours PDF)