Cours Algo 2: Les Pointeurs

Ce cours aborde les pointeurs, un concept fondamental en programmation et en algorithmique. Il s’inscrit dans un module d’informatique appliquée de première année, et explique comment manipuler les adresses mémoire à travers les pointeurs, leurs opérations de base, leur relation 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

Cours Algo 2: Les Pointeurs

Computer Science · PDF · 5 pages · 2010

Afficher l'aperçu du document

Consulter le document original →

Ce cours aborde les pointeurs, un concept fondamental en programmation et en algorithmique. Il s’inscrit dans un module d’informatique appliquée de première année, et explique comment manipuler les adresses mémoire à travers les pointeurs, leurs opérations de base, leur relation avec les tableaux et les chaînes de caractères.

Adressage direct et 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, on peut accéder directement à la valeur 10 via le nom a, et l’adresse mémoire de a peut être notée &a (par exemple F802H).

L’adressage indirect, quant à lui, utilise un pointeur, une variable spéciale qui contient l’adresse d’une autre variable. Par exemple, si q est un pointeur sur entier et contient l’adresse de a, on peut accéder à la valeur de a en passant par q. Ainsi, si q contient F802H, alors *q désigne la valeur contenue à cette adresse, soit 10.

Un pointeur est donc une variable qui contient l’adresse d’une autre variable. La mémoire est organisée en octets (groupes de 8 bits) numérotés à partir de zéro. La taille de l’espace mémoire réservé à une variable dépend de son type : un caractère occupe un octet, un réel occupe 4 octets consécutifs, etc. L’adresse d’une variable correspond à l’adresse de son premier octet.

Chaque pointeur est lié à un type de données et peut contenir l’adresse d’une variable simple ou d’un élément 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 pointeur et nom de variable : le nom d’une variable est lié de façon fixe à une adresse mémoire, tandis qu’un pointeur peut changer d’adresse pointée.

Les opérateurs de base des pointeurs

Pour manipuler les pointeurs, deux opérateurs sont essentiels :

  • L’opérateur adresse de (&) : <NomVariable> fournit l’adresse de la variable. Il ne peut s’appliquer qu’à des variables ou tableaux en mémoire, pas à des constantes ou expressions.
  • L’opérateur contenu de (*) : *<NomPointeur> donne accès au contenu de l’adresse référencée par le pointeur.

Lors de la déclaration, un pointeur est explicitement lié à un type de données. Par exemple, un pointeur sur entier ne peut recevoir l’adresse que d’une variable entière.

Opérations élémentaires sur pointeurs

La valeur spéciale NIL (souvent 0) indique qu’un pointeur ne pointe sur aucune adresse valide. Les pointeurs peuvent être manipulés comme des variables classiques. Par exemple, si P1 et P2 sont deux pointeurs sur entier, l’affectation P1 <- P2 fait pointer P1 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 un élément quelconque d’un tableau, alors :

  • P + 1 pointe sur l’élément suivant
  • P - 1 pointe sur l’élément précédent
  • Plus généralement, P + i pointe sur l’élément situé i positions après P

Par exemple, après P <- A, *(P + 1) désigne le contenu de A[2], *(P + 2) celui de A[3], etc.

Attention, P + i ne désigne pas l’octet i après P, mais la i-ème composante après P, en tenant compte de la taille du type pointé.

Il existe une différence essentielle entre un pointeur et le nom d’un tableau :

  • Un pointeur est une variable, on peut donc modifier sa valeur (P <- A ou P <- P + 1 sont possibles).
  • Le nom d’un tableau est une constante, donc on ne peut pas lui affecter une autre valeur (A <- P ou A <- A + 1 sont impossibles).

Arithmétique des pointeurs

Les opérations sur pointeurs tiennent compte automatiquement 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 A[i], alors P + n pointe sur A[i + n], et P - n sur A[i - n].
  • Incrémentation et décrémentation : P <- P + n ou P <- P - n modifient la position du pointeur dans le tableau.

Ces opérations sont définies uniquement à l’intérieur d’un tableau. Si l’adresse résultante sort du domaine du tableau, le comportement 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
  • Le résultat est zéro si P1 et P2 pointent sur le même élément
  • Le résultat est positif si P1 suit P2
  • Le résultat est indéfini si P1 et P2 ne pointent pas dans le même tableau

Cette soustraction est équivalente à la différence des indices correspondants dans le tableau.

Comparaison de deux pointeurs : On peut comparer deux pointeurs avec les opérateurs <, >, <=, >=, ==, et <>. La comparaison est équivalente à celle des indices si les pointeurs appartiennent au même tableau. Sinon, elle dépend de leurs positions relatives 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. On peut considérer une chaîne de caractères comme un tableau de caractères.

Par exemple, si Cc est une variable 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 la chaîne.

La chaîne Cc est constante et 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 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

  • Un pointeur est une variable contenant l’adresse d’une autre variable.
  • L’adressage direct utilise le nom de la variable, l’adressage indirect passe par 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.
  • Les opérations arithmétiques sur pointeurs tiennent compte du type pointé et sont définies uniquement dans le domaine du tableau.
  • La soustraction et la comparaison de pointeurs sont basées sur leurs positions dans le même tableau.
  • Un pointeur sur caractère peut pointer sur une chaîne de caractères constante.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions