Académique Documents
Professionnel Documents
Culture Documents
Dr N. BAME
Dr N. BAME 1
I. Introduction: notion d'adresse
• La mémoire centrale utilisée par les programmes, est découpée en
octets. Chacun de ces octets est identifié par un numéro
séquentiel. Par convention, ce numéro est noté en hexadécimal et
précédé par 0x.
• Exemple: 0x3fffd10
0x3fffd11
0x3fffd12
0x3fffd13
0x3fffd14
0x3fffd15
0x3fffd16
0x3fffd17
…
• Déclarer une variable consiste à réserver une zone en mémoire
occupant un certain nombre d‘octets (sa taille) et à laquelle on
donne un nom. Le numéro du premier octet de cette zone
correspond à l‘adresse de la variable.
2
Dr N. BAME
Exemple
• short int n = 18;
0x3fffd10
0x3fffd11 Dans cet exemple, la valeur
0x3fffd12 de la variable n est 18 et
0x3fffd13 son adresse est 0x3fffd14.
0x3fffd14 18 n
0x3fffd15
0x3fffd16
0x3fffd17
…
Dr N. BAME 3
I. Introduction: notion d'adresse
• Pour accéder à la valeur contenue dans une
variable, on utilise tout simplement son nom.
Dr N. BAME 4
II. Notion de pointeur
• II-1. Définition
• Un pointeur est une variable dont la valeur est
l'adresse d'une autre variable.
– On dit que le pointeur pointe sur la variable dont il contient
l'adresse.
0x3fffd10
0x3fffd14 p p est un pointeur contient l'adresse
0x3fffd11
de la variable n ( p pointe sur n)
0x3fffd12
p est placé à l'adresse 0x3fffd10.
0x3fffd13
0x3fffd14 18 n
0x3fffd15 n est placé à l'adresse 0x3fffd14
0x3fffd16
0x3fffd17
Dr N. BAME 6
II-2. Représentation :
pointeur
variable pointée
• Exemple p
18
n
Dr N. BAME 7
II-3. Déclaration d'un pointeur
• syntaxe :
En algorithmique
variable
identificateur_pointeur : pointeur sur type
Exemple :
p: pointeur sur entier
En C
type* identificateur_pointeur ;
Exemple :
int* p ;
Dr N. BAME 8
II-4. Manipulation d'un pointeur
• Après avoir déclaré un pointeur, on peut l’initialiser
en lui donnant l’adresse d’une variable existante.
• Exemple:
En Algorithmique En C
Dr N. BAME 9
II-4. Manipulation d'un pointeur
• Il est possible d’accéder à la zone mémoire pointée.
• Pour cela on utilise, en algorithmique et en C,
l’opérateur *.
Dr N. BAME 10
Exemple
En Algorithmique En C
variable
n: entier int main()
p: pointeur sur entier {
Début int n = 33;
n = 33 int* p; //déclaration du
p = adresse de n // p pointe sur pointeur p
n p = &n; // p pointe sur n
Ecrire(*p) //la valeur 33 est printf("%d", *p) ; //affiche 33 à
affichée l'écran, la valeur de n
*p = 34 // n vaut maintenant *p = 34 ; // n vaut maintenant
34 34
Fin }
Dr N. BAME 11
Remarque
• Par défaut lorsque l’on déclare un pointeur, on ne
sait pas sur quoi il pointe.
Dr N. BAME 12
Exemple :
En Algorithmique En C
Fin
Dr N. BAME 13
II-5. Double indirection
• Le fait qu'un pointeur pointe sur une variable s'appelle
indirection (comme accès indirect). Quand un pointeur
pointe sur un autre pointeur, il y a double indirection.
…
… 0x3fffd10 p2 pointe sur p1 qui pointe sur n
p2
…
…
0x3fffd10
0x3fffd11 0x3fffd14 p1 On peut accèder à n par p2 en
0x3fffd12 utilisant deux fois l'opérateur *
0x3fffd13 * *p2 est équivalent à *p1, c'est à dire à n
0x3fffd14
0x3fffd15 18 n
0x3fffd16
0x3fffd17
Dr N. BAME 14
III-1. Allocation dynamique en Algorithmique
• L’allocation dynamique se fait par l’instruction :
identificateur_pointeur = allouer(unType)
où
identificateur_pointeur est l'identificateur du pointeur
unType est le type de l’objet pointé.
• Exemple:
variable
p: pointeur sur entier
Début
p = allouer(entier)
...
Fin Dr N. BAME 15
III-1. Allocation dynamique en Algorithmique
• Enfin, lorsque l'on n'a plus besoin de l'espace
mémoire alloué dynamiquement (c'est-à-dire
quand on n'utilise plus le pointeur nom_pointeur), il
faut libérer cette place en mémoire.
– désallouer(identificateur_pointeur)
Dr N. BAME 16
III-2. Allocation dynamique de mémoire en C
• En C, l’allocation dynamique de mémoire peut se faire
avec les fonctions malloc et calloc de la bibliothèque
standard stdlib.h:
• Exemple
free(p) ; // permet de libérer la zone mémoire pointée
par p. Dr N. BAME 19
IV. Pointeurs et structures
• Il est très courant d'utiliser un pointeur pour
mémoriser l'adresse d'une variable structure.
• Si p est un pointeur sur une structure, *p désigne la
structure pointée.
• On peut donc accéder à un champ de la structure
pointée par l'expression : (*p).champ
• L'usage de parenthèses est ici indispensable car
l'opérateur * a une priorité moins élevée que
l'opérateur point (.).
• Cette notation peut être simplifiée grâce à
l'opérateur .
• L'expression précédente est strictement équivalente
à : p champ Dr N. BAME
20
Exemple
struct date
{
int jour;
int mois;
int annee;
};
• p1 = p2;
Dr N. BAME 23
VI. Pointeurs et tableaux en C
• L'usage des pointeurs en C est, en grande partie,
orienté vers la manipulation des tableaux.
#include <stdio.h>
#define N 5
int main( )
{
int tab[5] = {1, 2, 6, 0, 7};
int * p;
for (p=tab; p<=tab+N-1; p++)
printf(" %d \n",*p);
}
Dr N. BAME 26
Remarque
• On peut déclarer un tableau comme un pointeur sur le
type de ses éléments.
• Exemple:
int * tab;
ou bien
Dr N. BAME 29
VII. Pointeurs et chaînes de caractères en C
• Comme un tableau de caractères:
• Exemple :
char ch[10];
– char * ch;