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

Cours Algo 2 : Les Pointeurs

Computer Science · PDF · 5 pages · 2010

Afficher l'aperçu du document

Consulter le document original →

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 :

VariableValeurAdresse
a10F802H
qF802H (adresse de a)F400H

On a :

  • a = 10
  • &a = F802H (adresse de a)
  • q = F802H (pointeur qui pointe sur a)
  • &q = F400H (adresse de q)
  • *q = 10 (contenu pointé par q)

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 :

AdresseF800F801F802F803
Octetoctet1octet2octet3octet4

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 + 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) désigne le contenu de A[3]
  • *(P + i) désigne le contenu de A[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 <- A ou P <- P + 1.
  • Le nom d'un tableau est une constante : on ne peut pas faire A <- P ou A <- 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 P1 et P2 sont deux pointeurs sur le même type, alors P1 <- P2; fait pointer P1 sur le même objet que P2.
  • Addition et soustraction d'un entier : si P pointe sur A[i] d'un tableau, alors :
    • P + n pointe sur A[i+n]
    • P - n pointe sur A[i-n]
  • Incrémentation et décrémentation : après P <- P + n;, P pointe sur A[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 - P2 donne le nombre de composantes entre P1 et P2.
  • Le résultat est négatif si P1 précède P2, zéro s'ils sont égaux, positif si P2 précède P1.
  • 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 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.

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