Cours Algo 2: Les pointeurs

Page 1 sur 5Lecteur de document UniversityLib

Cours Algo 2: Les pointeurs

Informatique Appliquée · notes

Browse all programmation documents

É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

Advertisement

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

Advertisement

  • 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,

Advertisement

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

Advertisement

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