Cours Algo 2: Les pointeurs
Ce cours traite des pointeurs en informatique, un concept fondamental dans la gestion de la mémoire et la manipulation des données. Il s'inscrit dans un cursus d'informatique appliquée de première année et explique les notions d'adressage direct et indirect, les opérateurs associés aux pointeurs, ainsi que leur utilisation avec les tableaux et les chaînes de caractères.
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
Informatique Appliquée · PDF · 5 pages · 2010
Afficher l'aperçu du document
Ce cours traite des pointeurs en informatique, un concept fondamental dans la gestion de la mémoire et la manipulation des données. Il s'inscrit dans un cursus d'informatique appliquée de première année et explique les notions d'adressage direct et indirect, les opérateurs associés aux pointeurs, ainsi que leur utilisation avec les tableaux et les chaînes de caractères.
Adressage direct et adressage indirect
Pour stocker des informations, on utilise des variables dont la valeur est située à une adresse spécifique dans la mémoire interne de l'ordinateur. L'adressage direct consiste à accéder au contenu d'une variable par son nom. Par exemple, si a est une variable entière valant 10, écrire a affiche 10, et l'adresse mémoire de a peut être, par exemple, F802H.
L'adressage indirect intervient lorsque l'on ne peut ou ne veut pas utiliser directement le nom d'une variable. On copie alors l'adresse de cette variable dans une variable spéciale appelée pointeur. Ce pointeur contient l'adresse mémoire de la variable cible, et on peut accéder à la valeur de cette variable en passant par le pointeur.
Par exemple, si a est une variable entière contenant 10, et q un pointeur sur entier, on peut écrire q <- &a ; ce qui signifie que q contient l'adresse de a. Ainsi, *q désigne le contenu de l'adresse pointée par q, c’est-à-dire la valeur 10.
Un pointeur est donc une variable spéciale qui contient l'adresse d'une autre variable. Si un pointeur q contient l'adresse d'une variable a, on dit que "q pointe sur a".
Organisation de la mémoire et types de variables
La mémoire de l'ordinateur est organisée en octets (groupes de 8 bits), numérotés à partir de zéro. L'adresse d'un octet correspond à son numéro. L'espace mémoire réservé à une variable dépend de son type :
- Une variable de type caractère occupe un octet (une adresse).
- Une variable de type réel occupe 4 octets consécutifs, donc 4 adresses mémoire.
L'adresse d'une variable correspond à l'adresse du premier octet qu'elle occupe.
Chaque pointeur est lié à un type de données précis. Il peut contenir l'adresse d'une variable simple de ce type ou d'une composante d'un tableau de ce type. La taille d'un pointeur est constante, généralement 4 octets, quelle que soit la variable pointée.
Il est important de distinguer un pointeur d'un nom de variable : un pointeur peut changer d'adresse pointée, tandis que le nom d'une variable est toujours lié à la même adresse mémoire.
Les opérateurs de base sur les pointeurs
Pour manipuler les pointeurs, deux opérateurs sont essentiels :
- L'opérateur "adresse de" (&) : &NomVariable fournit l'adresse de la variable NomVariable. Cet opérateur ne peut s'appliquer qu'à des variables ou tableaux, pas à des constantes ou expressions.
- L'opérateur "contenu de" (*) : *NomPointeur désigne le contenu de l'adresse référencée par le pointeur NomPointeur.
Lors de la déclaration, un pointeur est explicitement lié à un type. Par exemple, un pointeur sur entier ne peut recevoir l'adresse que d'une variable de type entier.
Opérations élémentaires sur pointeurs
Un pointeur peut prendre la valeur spéciale NIL (0), indiquant qu'il ne pointe sur aucune adresse valide.
Les pointeurs sont des variables et peuvent être affectés entre eux. Par exemple, si P1 et P2 sont deux pointeurs sur entier, l'instruction P1 <- P2; fait que 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 peut être vu comme un pointeur constant sur son premier élément.
Par exemple, pour un tableau A de 10 entiers et un pointeur P sur entier, l'instruction P <- A; est équivalente à P <- &A[1];
Si P pointe sur une composante quelconque d'un tableau, alors :
- P + 1 pointe sur la composante suivante
- P + i pointe sur la i-ième composante après P
- P - i pointe sur la i-ième composante avant P
Par exemple, après P <- A;, *(P+1) désigne le contenu de A[2], *(P+2) celui de A[3], et ainsi de suite.
Il est important de noter que P + i n'adresse pas l'octet i après P, mais la i-ième composante du type pointé après P.
Une différence essentielle entre un pointeur et le nom d'un tableau est que :
- Un pointeur est une variable, donc on peut lui affecter une nouvelle adresse (P <- A ou P <- P + 1 sont permis).
- Le nom d'un tableau est une constante, donc des opérations comme A <- P ou A <- A + 1 sont interdites.
Arithmétique des pointeurs
Les opérations sur pointeurs tiennent compte du type et de la taille des objets pointés :
- Affectation : Si P1 et P2 sont deux pointeurs sur le même type, P1 <- P2; fait pointer P1 sur le même objet que P2.
- Addition et soustraction : Si P pointe sur l'élément A[i] d'un tableau, alors P + n pointe sur A[i+n], et P - n sur A[i-n].
- Incrémentation et décrémentation : Après P <- P + n;, P pointe sur A[i+n].
Ces opérations sont définies uniquement à l'intérieur du domaine d'un tableau. Si le pointeur sort de ce domaine, le résultat est indéfini.
Soustraction de deux pointeurs : Si P1 et P2 pointent dans le même tableau, P1 - P2 donne le nombre de composantes entre eux :
- Le résultat est négatif si P1 précède P2
- Zéro si P1 = P2
- Positif si P1 suit P2
- Indéfini si P1 et P2 ne pointent pas dans le même tableau
Cette soustraction est équivalente à la soustraction des indices correspondants.
Comparaison de pointeurs : On peut comparer deux pointeurs avec les opérateurs <, >, <=, >=, ==, <>. La comparaison est équivalente à celle des indices si les pointeurs appartiennent au même tableau. Sinon, elle dépend de leur position relative 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 peuvent être considérées comme des tableaux de caractères.
Par exemple, si Cc est une chaîne de caractères initialisée à « premiere annee informatique » et P un pointeur sur caractère, l'instruction P <- Cc; fait pointer P sur le premier caractère de cette chaîne.
Il est important de noter que :
- Une chaîne constante comme Cc est non modifiable, contrairement à une chaîne déclarée comme tableau de caractères.
- Un pointeur sur entier peut pointer sur une variable entière simple ou un élément d'un tableau d'entiers.
- Un pointeur sur caractère peut pointer sur une variable caractère simple, un élément d'un tableau de caractères, ou une chaîne de caractères constante.
Points clés
- Le pointeur est une variable contenant l'adresse d'une autre variable.
- L'adressage direct utilise le nom de la variable, l'adressage indirect utilise un pointeur.
- Les opérateurs essentiels sont & (adresse de) et * (contenu de).
- Le nom d'un tableau est un pointeur constant sur son premier élément.
- L'arithmétique des pointeurs (addition, soustraction) tient compte du type pointé et est définie uniquement dans un tableau.
- La soustraction de deux pointeurs dans un même tableau donne la distance en nombre d'éléments.
- Un pointeur peut pointer sur des variables simples, des éléments de tableau, ou des chaînes de caractères.
- Le pointeur NIL (valeur 0) indique qu'il ne pointe sur aucune adresse valide.
Commentaires
Aucun commentaire pour le moment. Posez la première question.