Cours Algo 2 : Les Pointeurs
Ce cours traite des pointeurs en informatique, un concept fondamental pour les étudiants de première année en informatique appliquée. Il explique comment accéder à la mémoire via des variables et des pointeurs, les opérations de base sur les pointeurs, leur relation avec les tableaux et les chaînes de caractères, ainsi que l'arithmétique des pointeurs.
D'après le document Cours Algo 2 : Les Pointeurs
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.
Document source
Computer Science · PDF · 5 pages · 2010
Afficher l'aperçu du document
Ce cours traite des pointeurs en informatique, un concept fondamental pour les étudiants de première année en informatique appliquée. Il explique comment accéder à la mémoire via des variables et des pointeurs, les opérations de base sur les pointeurs, leur relation avec les tableaux et les chaînes de caractères, ainsi que l'arithmétique des pointeurs.
Adressage direct
Pour stocker des informations, on utilise des variables. La valeur d'une variable se trouve à un emplacement spécifique dans la mémoire interne de l'ordinateur. Le nom de la variable permet d'accéder directement à cette valeur.
Adressage direct : accès au contenu d'une variable par son nom.
a : entier
a <- 10
Ecrire(a) ; // affichage : 10
&a : F802H
En mémoire, la variable a contenant la valeur 10 est stockée à l'adresse F802H.
Adressage indirect
Si on ne veut ou ne peut pas utiliser le nom d'une variable a, on peut copier son adresse dans une variable spéciale appelée pointeur, par exemple q. Ensuite, on accède à la valeur de a via ce pointeur.
Adressage indirect : accès au contenu d'une variable en passant par un pointeur qui contient son adresse.
a : entier
q : pointeur sur entier // notation : q : ^entier
q <- &a ;
En mémoire :
| Variable | Valeur | Adresse |
|---|---|---|
| a | 10 | F802H |
| q | F802H (adresse de a) | F400H |
On a :
a= 10&a= F802H (adresse dea)q= F802H (pointeur qui pointe sura)&q= F400H (adresse deq)*q= 10 (contenu pointé parq)
Si un pointeur q contient l'adresse d'une variable a, on dit que q pointe sur a. On peut alors accéder à la valeur de a par (*q).
Définition d’un pointeur : une variable spéciale qui contient l'adresse d'une autre variable.
Organisation de la mémoire et taille des variables
La mémoire est organisée en octets (groupes de 8 bits) numérotés à partir de zéro. L'adresse d'un octet est son numéro.
La taille de l'espace mémoire réservé dépend du type de la variable :
- Variable de type caractère : 1 octet (1 adresse)
- Variable de type réel : 4 octets consécutifs (4 adresses)
Exemple pour une variable réelle a :
| Adresse | F800 | F801 | F802 | F803 |
|---|---|---|---|---|
| Octet | octet1 | octet2 | octet3 | octet4 |
L'adresse de la variable est l'adresse du premier octet (ici F800).
Chaque pointeur est lié à un type de données et peut contenir l'adresse d'une variable simple de ce type ou d'une composante d'un tableau de ce type.
Taille d’un pointeur : toujours la même, quelle que soit la variable pointée, généralement 4 octets selon la machine.
Différence entre pointeurs et noms de variables
- Un pointeur est une variable qui peut pointer sur différentes adresses.
- Le nom d'une variable est toujours lié à la même adresse mémoire.
Les opérateurs de base
Pour manipuler les pointeurs, deux opérateurs sont essentiels :
- Opérateur adresse de : &
<NomVariable> fournit l'adresse de la variable. Il s'applique uniquement aux variables et tableaux, pas aux constantes ou expressions. - Opérateur contenu de : *
*<NomPointeur> désigne le contenu de l'adresse référencée par le pointeur.
Exemple :
a : entier
q : pointeur sur entier
q <- &a
valeur <- *q // valeur contient la valeur de a
Remarque : un pointeur déclaré sur un type ne peut recevoir l'adresse que d'une variable de ce même type.
Opérations élémentaires sur pointeurs
Pointeur NIL : la valeur 0 indique qu'un pointeur ne pointe sur rien (nulle part). Cette valeur peut être prise par tout pointeur quel que soit son type.
Les pointeurs sont des variables et peuvent être manipulés comme telles. Par exemple, si P1 et P2 sont deux pointeurs sur entier :
P1 <- P2; // P1 pointe sur le même objet que P2
Pointeurs et tableaux
Le nom d'un tableau représente l'adresse de son premier élément. Ainsi :
&tableau[1] et tableau désignent la même adresse.
Le nom d'un tableau est un pointeur constant sur le premier élément du tableau.
Exemple :
A : tableau de [1..10] d’entier
P : pointeur sur entier
P <- A; // équivalent à P <- &A[1]
Si P pointe sur une composante quelconque du tableau, alors :
P + 1pointe sur la composante suivanteP + ipointe sur la i-ième composante aprèsPP - ipointe sur la i-ième composante avantP
Par exemple, après P <- A; :
*(P + 1)désigne le contenu deA[2]*(P + 2)désigne le contenu deA[3]*(P + i)désigne le contenu deA[i+1]
Remarque : P + i n'adresse pas le i-ième octet après P, mais la i-ième composante après P.
Différence essentielle entre pointeur et nom de tableau :
- Un pointeur est une variable : on peut faire
P <- AouP <- P + 1. - Le nom d'un tableau est une constante : on ne peut pas faire
A <- PouA <- A + 1.
Arithmétique des pointeurs
Les opérations sur pointeurs tiennent compte automatiquement du type et de la taille des objets pointés.
- Affectation : si
P1etP2sont deux pointeurs sur le même type, alorsP1 <- P2;fait pointerP1sur le même objet queP2. - Addition et soustraction d'un entier : si
Ppointe surA[i]d'un tableau, alors :P + npointe surA[i+n]P - npointe surA[i-n]
- Incrémentation et décrémentation : après
P <- P + n;,Ppointe surA[i+n].
Domaine des opérations : ces opérations sont définies uniquement à l'intérieur d'un tableau. Si l'adresse obtenue sort du domaine du tableau, le résultat est indéfini.
Soustraction de deux pointeurs : si P1 et P2 pointent dans le même tableau :
P1 - P2donne le nombre de composantes entreP1etP2.- Le résultat est négatif si
P1précèdeP2, zéro s'ils sont égaux, positif siP2précèdeP1. - Indéfini si
P1etP2ne pointent pas dans le même tableau.
Cette soustraction est équivalente à la soustraction des indices correspondants.
Comparaison de pointeurs : on peut comparer deux pointeurs par <, >, <=, >=, ==, <>.
La comparaison de deux pointeurs dans le même tableau correspond à la comparaison de leurs indices. Si les pointeurs ne pointent pas dans le même tableau, la comparaison dépend de leurs positions en mémoire.
Pointeurs et chaînes de caractères
Un pointeur peut désigner le début d'une chaîne de caractères, de la même manière qu'il désigne le début d'un tableau. Les chaînes de caractères sont considérées comme des tableaux de caractères.
Exemple :
Cc : chaîne de caractères
P : pointeur sur caractère
Cc = "premiere annee informatique"
P <- Cc
On déclare une variable Cc de type chaîne de caractères initialisée à la chaîne constante "premiere annee informatique". Cette chaîne est non modifiable, contrairement à une chaîne déclarée comme tableau de caractères qui peut être modifiée.
En général :
- Un pointeur sur entier peut pointer sur :
- Une variable simple de type entier
- Un élément d’un tableau d’entiers
- Un pointeur sur caractère peut pointer sur :
- Une variable simple de type caractère
- Un élément d’un tableau de caractères
- Une chaîne de caractères constante (non modifiable)
Glossaire des termes clés
- Adressage direct : accès au contenu d'une variable par son nom.
- Adressage indirect : accès au contenu d'une variable via un pointeur contenant son adresse.
- Pointeur : variable spéciale contenant l'adresse d'une autre variable.
- Opérateur & : opérateur "adresse de" qui fournit l'adresse d'une variable.
- Opérateur * : opérateur "contenu de" qui accède au contenu pointé par un pointeur.
- Pointeur NIL : valeur 0 indiquant qu'un pointeur ne pointe sur rien.
- Nom de tableau : constante représentant l'adresse du premier élément d'un tableau.
- Arithmétique des pointeurs : opérations d'addition, soustraction, incrémentation et décrémentation sur des pointeurs, tenant compte du type pointé.
- Chaîne de caractères : tableau de caractères pouvant être pointé par un pointeur sur caractère.
Points clés à retenir
- Un pointeur contient une adresse mémoire et permet d'accéder indirectement à une variable.
- Le nom d'une variable est lié à une adresse fixe, alors qu'un pointeur peut changer d'adresse pointée.
- Les opérateurs & et * sont essentiels pour manipuler les pointeurs.
- Le nom d'un tableau est un pointeur constant sur son premier élément.
- L'arithmétique des pointeurs permet de naviguer dans un tableau en décalant l'adresse pointée.
- La soustraction et la comparaison de pointeurs sont définies uniquement pour des pointeurs dans le même tableau.
- Un pointeur sur caractère peut pointer sur une chaîne de caractères constante ou modifiable.
Commentaires
Aucun commentaire pour le moment. Posez la première question.