Les pointeurs en C
Séance 5
de l'UE « introduction à la programmation »
Bruno Bouzy
[Link]@[Link]
Pointeurs
• Définition, utilisation de base
• Utilisation avec les fonctions
• Utilisation avec les tableaux
• Utilisation avec les structures
pointeurs 2
Déclaration
• Déclaration d'un pointeur sur int
int * p;
pointeurs 3
Initialisation
• Convention d'initialisation avec NULL
p = NULL;
pointeurs 4
Affectation
• Affectation avec une adresse de variable
int a;
...
p = &a;
pointeurs 5
Déréférencement
• Déréférencement d'un pointeur
int b;
b = *p;
pointeurs 6
Exemple basique (1/5)
int * p;
p
?
int *
pointeurs 7
Exemple basique (2/5)
int * p;
int a=4;
p
? a 4
int * int
pointeurs 8
Exemple basique (3/5)
int * p;
int a=4;
p = &a;
p
a 4
int * int
• p « pointe » sur a
• &a : adresse de a
pointeurs 9
Exemple basique (4/5)
int * p;
int a=4;
p = &a;
int b; p b
a 4 ?
int * int int
pointeurs 10
Exemple basique (5/6)
int * p;
int a=4;
p = &a;
int b; p
a b 4
4
b = *p; int * int int
• *p : contenu de la variable « pointée » par p
• *p : « déréférencement » de p
pointeurs 11
Exemple basique (6/6)
int a=4; int * p = &a;
int b; b = *p;
p
a 4 b 4
int * int int
• p « pointe » sur a
• &a adresse de a
• *p contenu de la variable pointée par p
ou « déréférencement » de p
pointeurs 12
Type d'un pointeur
float a=4.0; int * p = &a;
• Erreur de compilation: un pointeur est un pointeur
sur des variables d'un type donné.
float a=4.0; float * p = &a;
• Une variable de type truc * pointe sur un truc
pointeurs 13
Les erreurs
• Un pointeur non initialisé sur une adresse de
variable ne peut etre déréférencé.
int * p; int b; b = *p;
• Erreur d'exécution.
int * p = NULL; int b; b = *p;
• Erreur d'exécution.
pointeurs 14
Utilisation de NULL (1/3)
• Pourquoi initialiser un pointeur avec NULL ?
• 3 cas: le pointeur pointe sur
– la variable adéquate et on peut s'en servir
– une variable inadéquate et le programme est
incorrect
– NULL
• Convention:
– On affecte NULL quand un pointeur ne sert plus
ou pas encore
pointeurs 15
Utilisation de NULL (2/3)
• Avec cette convention, 2 cas:
– Pointeur sur variable adéquate
– Pointeur NULL
• Avant d'utiliser un pointeur on teste sa valeur:
if (p!=NULL) { ... b = *p; ...}
else { ... }
pointeurs 16
Utilisation de NULL (3/3)
• Avec cette convention le pointeur est mis à NULL
– Après utilisation:
p = &a; ... b = *p; ... p = NULL;
– A la déclaration (si non simultanée de l'affectation):
int * p = NULL; ... p = &a;
pointeurs 17
Exemple 1
• printf("a = %d, b = %d, *p = %d.\n", a,
b, *p); après chaque ligne.
• sortie du programme ?
int a = 1; int * p = &a; int b = *p;
a = 2;
b = 3;
p = &b;
a = 4;
b = 5;
pointeurs 18
Exemple 1
int a = 1; int * p = &a; int b = *p;
p
a 1 b 1
int * int int
a = 1, b = 1, *p = 1.
pointeurs 19
Exemple 1
int a = 1; int * p = &a; int b = *p;
a = 2;
p
a 2 b 1
int * int int
a = 2, b = 1, *p = 2.
pointeurs 20
Exemple 1
int a = 1; int * p = &a; int b = *p;
a = 2;
b = 3;
p
a 2 b 3
int * int int
a = 2, b = 3, *p = 2.
pointeurs 21
Exemple 1
int a = 1; int * p = &a; int b = *p;
a = 2;
b = 3;
p = &b;
p
a 2 b 3
int * int int
a = 2, b = 3, *p = 3.
pointeurs 22
Exemple 1
int a = 1; int * p = &a; int b = *p;
a = 2;
b = 3;
p = &b;
a = 4;
p
a 4 b 3
int * int int
a = 4, b = 3, *p = 3.
pointeurs 23
Exemple 1
int a = 1; int * p = &a; int b = *p;
a = 2;
b = 3;
p = &b;
a = 4;
b = 5; p
a 4 b 5
int * int int
a = 4, b = 5, *p = 5.
pointeurs 24
Exemple 1
• sortie:
a = 1, b = 1, *p = 1.
a = 2, b = 1, *p = 2.
a = 2, b = 3, *p = 2.
a = 2, b = 3, *p = 3.
a = 4, b = 3, *p = 3.
a = 4, b = 5, *p = 5.
• 2 changements d'un coup si on modifie le
contenu d'une variable pointée.
pointeurs 25
Exemple 2
printf("a = %d, b = %d, *p = %d, *q =
%d.\n", a, b, *p, *q); après chaque ligne
(sauf ligne 1 et 2).
• sortie du programme ?
int a = 1; int b = 2;
int * p = &a;
int * q = p;
a = 3;
b = *q + 10;
pointeurs 26
Exemple 2
int a = 1; int b = 2;
a 1 b 2
int int
a = 1, b = 2.
pointeurs 27
Exemple 2
int a = 1; int b = 2;
int * p = &a;
a 1 b 2
int int
p
int *
a = 1, b = 2, *p = 1
pointeurs 28
Exemple 2
int a = 1; int b = 2;
int * p = &a;
int * q = p;
a 1 b 2
int int
p q
int * int *
a = 1, b = 2, *p = 1, *q = 1.
pointeurs 29
Exemple 2
int a = 1; int b = 2;
int * p = &a;
int * q = p;
a = 3;
a 3 b 2
int int
p q
int * int *
a = 3, b = 2, *p = 3, *q = 3.
pointeurs 30
Exemple 2
int a = 1; int b = 2;
int * p = &a;
int * q = p;
a = 3;
b = *q + 10;
a 3 b 13
int int
p q
int * int *
a = 3, b = 13, *p = 3, *q = 3.
pointeurs 31
Exemple 2
a = 1, b = 2, *p = 1, *q = 1.
a = 3, b = 2, *p = 3, *q = 3.
a = 3, b = 13, *p = 3, *q = 3.
• 3 changements en une instruction.
pointeurs 32
Exemple 3
• Sortie ?
int a = 1; int b = 2;
int * p = &a; int * q = &b;
printf("a = %d, b = %d.\n", a, b);
printf("*p = %d, *q = %d.\n", *p, *q);
printf("&a = %p, &b = %p.\n", &a, &b);
printf(" p = %p, q = %p.\n", p, q);
pointeurs 33
Exemple 3
int a = 1; int b = 2;
int * p = &a; int * q = &b;
a 1 b 2
int int
p q
int * int *
pointeurs 34
Exemple 3
a = 1, b = 2.
*p = 1, *q = 2.
&a = 0xbffcfab4, &b = 0xbffcfab0.
p = 0xbffcfab4, q = 0xbffcfab0.
• Ici, les adresses de a et b se suivent.
– &b = &a – 4 (en octets)
– (non garanti)
• %p est le format d'entrée sortie d'un pointeur.
pointeurs 35
Résumé de la séance 5
• Pointeurs, utilisation:
– basique
– (avec des fonctions
– avec des tableaux
– avec des structures)
• Exemples
pointeurs 36