École Supérieure de Technologie
et d’Informatique
A.U. 2010/2011
Cours algo 2 : Les pointeurs
Informatique Appliquée 1ère année
1. Adressage direct
Pour stocker des informations, nous utilisons des variables. La valeur d'une variable se
trouve à un endroit spécifique dans la mémoire interne de l'ordinateur. Le nom de la
variable nous permet alors d'accéder directement à cette valeur.
Adressage direct: Accès au contenu d'une variable par le nom de la variable.
a : entier
a<-10
Ecrire(a) ; // affichage : 10
&a : F802H
a
10
F800H
F801H
F802H
F803H
F804H
2. Adressage indirect
Si nous ne voulons ou ne pouvons pas utiliser le nom d'une variable a, nous pouvons copier
l'adresse de cette variable dans une variable spéciale p, appelée pointeur. Ensuite, nous
pouvons retrouver l'information de la variable a en passant par le pointeur p.
Adressage indirect: Accès au contenu d'une variable, en passant par un pointeur qui
contient l'adresse de la variable.
Exemple
Soit a une variable contenant la valeur 10 et q un pointeur qui contient l'adresse de a. En
mémoire, a et q peuvent se présenter comme suit:
a :entier
q :pointeur sur entier // q :^entier (2ème notation)
q<-&a ;
q pointe sur a
q
F802H
a
10
F400H
Publicité
F800H
F801H
F802H
F803H
F804H
a => 10 ; &a => F802H ; q => F802H ; &q => F400H ; *q => 10 ;
*a: n’a pas de sens
Si un pointeur q contient l'adresse d'une variable a, on dit que 'q pointe sur a'.
Et par conséquent : (*q) (cid:1) a ;
Définition d’un pointeur
Un pointeur est une variable spéciale qui contient l'adresse d'une autre variable.
Mme Wiem Yaiche Elleuch algo2, les pointeurs
Page 1
L’adresse est un moyen unique pour repérer un espace dans la mémoire d’un ordinateur. La
mémoire est organisée en groupes de 8 bits (1 octet).
La mémoire est une séquence d’octets numérotés en commençant par zéro. L’adresse d’un
octet est son numéro.
L’espace mémoire réservé lors de la déclaration d’une variable dépend du type de la
variable. Par exemple pour une variable de type caractère, il faut un seul octet, donc une
adresse mémoire. Pour une variable de type réel, il faut 4 octets consécutifs, donc l’espace
est étendu sur 4 adresses mémoires consécutives. L’adresse de cette variable est l’adresse de
début.
a : réel
&a : F800
a
octet1 octet2 octet3 octet4
F800 F801 F802 F803
Chaque pointeur est limité à un type de données. Il peut contenir l'adresse d'une variable
simple de ce type ou l'adresse d'une composante d'un tableau de ce type.
Taille d’un pointeur en mémoire : un pointeur a toujours la même taille quelque soit
l’objet pointé. Cette taille dépend de la machine et du modèle de mémoire utilisés (en
général 4 octets).
Remarque
Les pointeurs et les noms de variables ont le même rôle: Ils donnent accès à un
emplacement dans la mémoire interne de l'ordinateur. Il faut quand même bien faire la
différence:
- Un pointeur est une variable qui peut 'pointer' sur différentes adresses.
- Le nom d'une variable reste toujours lié à la même adresse.
3. Les opérateurs de base
Lors du travail avec des pointeurs, nous avons besoin
Publicité
- d'un opérateur 'adresse de' : & pour obtenir l'adresse d'une variable.
- d'un opérateur 'contenu de': * pour accéder au contenu d'une adresse.
• L'opérateur 'adresse de' : &
&<NomVariable> fournit l'adresse de la variable <NomVariable>
L'opérateur & peut seulement être appliqué à des objets qui se trouvent dans la mémoire
interne, c.-à-d. à des variables et des tableaux. Il ne peut pas être appliqué à des constantes
ou des expressions.
• L'opérateur 'contenu de' : *
*<NomPointeur> désigne le contenu de l'adresse référencée par le pointeur <NomPointeur>
Remarque
Lors de la déclaration d'un pointeur, ce pointeur est lié explicitement à un type de données.
Ainsi, la variable q déclarée comme pointeur sur entier ne peut pas recevoir l'adresse d'une
variable d'un autre type que entier.
Mme Wiem Yaiche Elleuch algo2, les pointeurs
Page 2
4. Les opérations élémentaires sur pointeurs
Le pointeur NIL : La valeur numérique 0 (zéro) est utilisée pour indiquer qu'un pointeur
ne pointe 'nulle part'. NIL est une valeur que peut prendre n’importe quel pointeur, quelque
soit le type de la variable qu’il pointe.
Les pointeurs sont des variables et peuvent être utilisés comme telles. Soit P1 et P2 deux
pointeurs sur entier, alors l'affectation
P1 <- P2;
copie le contenu de P2 vers P1. P1 pointe alors sur le même objet que P2.
5. Pointeurs et tableaux
Adressage des composantes d'un tableau
Le nom d'un tableau représente l'adresse de son premier élément. En d'autre termes:
&tableau[1] et tableau sont une seule et même adresse.
En simplifiant, nous pouvons retenir que le nom d'un tableau est un pointeur constant sur
le premier élément du tableau.
Exemple
En déclarant un tableau A de type entier et un pointeur P sur entier,
A : tableau de [1..10] d’entier
P : pointeur 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. Plus généralement,
P+i pointe sur la i-ième composante après P et
P-i pointe sur la i-ième composante avant P.
Ainsi, après l'instruction,
Publicité
P <- A;
le pointeur P pointe sur A[1], et
*(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 ...
Mme Wiem Yaiche Elleuch algo2, les pointeurs
Page 3
Remarque
Il existe toujours une différence essentielle entre un pointeur et le nom d'un tableau:
- Un pointeur est une variable, donc des opérations comme P<-A ou P<-P+1 sont permises.
- Le nom d'un tableau est une constante, donc des opérations comme A<-P ou A<-A+1 sont
impossibles.
6. Arithmétique des pointeurs
Toutes les opérations avec les pointeurs tiennent compte automatiquement du type et de la
grandeur des objets pointés.
- Affectation par un pointeur sur le même type
Soient P1 et P2 deux pointeurs sur le même type de données, alors l'instruction
P1 <- P2;
fait pointer P1 sur le même objet que P2
- Addition et soustraction d'un nombre entier
Si P pointe sur l'élément 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 d'un pointeur
Si P pointe sur l'élément A[i] d'un tableau, alors après l'instruction
P<-P+n; P pointe sur A[i+n]
P<-P-n; P pointe sur A[i-n]
Domaine des opérations
L'addition, la soustraction, l'incrémentation et la décrémentation sur les pointeurs sont
seulement définies à l'intérieur d'un tableau. Si l'adresse formée par le pointeur et l'indice
sort du domaine du tableau, alors le résultat n'est pas défini.
- Soustraction de deux pointeurs
Soient P1 et P2 deux pointeurs qui pointent dans le même tableau:
P1-P2 fournit le nombre de composantes comprises entre P1 et P2.
Le résultat de la soustraction P1-P2 est
- négatif, si P1 précède P2
- zéro,
- positif, si P2 precède P1
- indéfini, si P1 et P2 ne pointent pas dans le même tableau
Publicité
si P1 = P2
Plus généralement, la soustraction de deux pointeurs qui pointent dans le même tableau est
équivalente à la soustraction des indices correspondants.
- Comparaison de deux pointeurs
On peut comparer deux pointeurs par <, >, <=, >=, ==, <>.
La comparaison de deux pointeurs qui pointent dans le même tableau est équivalente à la
comparaison des indices correspondants. (Si les pointeurs ne pointent pas dans le même
tableau, alors le résultat est donné par leurs positions relatives dans la mémoire).
Mme Wiem Yaiche Elleuch algo2, les pointeurs
Page 4
7. Pointeur et chaine de caractère
Un pointeur désigne le début d’une chaine de caractère de la même manière qu’il désigne le
début d’un tableau. Il est possible de considérer les chaines de caractères comme étant des
tableaux de caractères.
Exemple :
Cc : chaine de caractère
P : pointeur sur caractère
Cc= « premiere annee informatique »
P<-Cc
Les instructions suivantes permettent de :
• Déclarer une variable Cc de type chaine de caractère
• Cette chaine Cc est initialisée à « premiere annee informatique ». C’est une chaine
constante, non modifiable, alors qu’une chaine déclarée comme un tableau de
caractères peut être modifiée.
D’une manière générale :
• un pointeur sur entier peut pointer sur :
o Une variable simple de type entier
o Un élément d’un tableau d’entiers
• un pointeur sur caractère peut pointer sur :
o Une variable simple de type caractère
o Un élément d’un tableau de caractères
o Une chaine de carctère constante (non modifiable)
Mme Wiem Yaiche Elleuch algo2, les pointeurs
Page 5