Vous êtes sur la page 1sur 7

2

Introduction

Algorithmique et programmation II
La plupart des langages de programmation offrent la
possibilit d'accder aux donnes dans la mmoire
de l'ordinateur l'aide de pointeurs, c.--d. l'aide
de variables auxquelles on peut attribuer les adresses
d'autres variables.

Les Pointeurs
3 LF T, 3LF E

I- Adressage de variables

I- Adressage de variables
Adressage indirect

Adressage direct : La valeur d'une variable se trouve un endroit spcifique dans la


mmoire interne de l'ordinateur. Le nom de la variable nous permet alors d'accder
directement cette valeur.

Ne pas utiliser le nom dune variable A, copier ladresse de cette variable dans une variable spciale P
appele Pointeur.

A: entier
A
10

Retrouver linformation de la variable A en passant par le pointeur P.

Accs au contenu dune variable en passant par un pointeur qui contient ladresse de la variable.

I- Adressage de variables

II- Les pointeurs


Dfinition

Adressage indirect

Un pointeur est une variable spciale qui peut contenir ladresse dune autre variable.
Si un pointeur P contient ladresse dune variable A, on dit que 'P pointe sur A'.
Un pointeur est limit un type de donnes. Il peut contenir :
Ladresse dune variable simple de ce type,
Ladresse dune composante dun tableau de ce type.

II- Les pointeurs

II- Les pointeurs


Les oprateurs de base

Les oprateurs de base


Lors du travail avec des pointeurs, nous avons besoin :
-

Dun oprateur 'Adresse de' : & pour obtenir ladresse dune variable.

Dun oprateur 'contenu de' : * pour accder au contenu dune adresse.

Dune syntaxe de dclaration pour pouvoir dclarer un pointeur.

a) Loprateur 'adresse de' : &


&< nom variable> : fournit ladresse de la variable < nom variable>.
b) Loprateur 'contenu de' : *
*< nom pointeur > : dsigne le contenu de ladresse rfrence par le pointeur <nom pointeur> .
c) Dclaration dun pointeur :
nom pointeur : Pointeur sur type Dclare un pointeur <nom pointeur> qui peut recevoir des
adresses de variables.
Remarque
Les pointeurs et les noms de variables ont le mme rle: Ils donnent accs un emplacement dans
la mmoire interne de l'ordinateur. Il faut quand mme bien faire la diffrence:
Un pointeur est une variable qui peut 'pointer' sur diffrentes adresses.
Le nom d'une variable reste toujours li la mme adresse.

10

II- Les pointeurs

II- Les pointeurs

Exemple :

Les oprations lmentaires sur les pointeurs

PNUM : pointeur sur entier

Priorit de * et & : mme priorit; ils sont valus de droite gauche

PNUM est un pointeur sur entier,

Exemple : Aprs linstruction P= &X;

PNUM peut contenir ladresse dune variable du type entier.

Y = *P +1 Y = X +1

*PNUM est de type int,

*P = *P + 10 X = X +10
*P += 2 X += 2

Exemple1

++*P ++X

P : pointeur sur entier

(*P)++ X++ ( les parenthses sont obligatoires)

A 10
B 50

Le pointeur NULL

Pointeurs sont des variables?

int * P / P =0; le pointeur P ne pointe nulle part

Aprs les instructions :


P &A P pointe sur A

P1 = P2 / copie le contenu de P2 dans P1 donc P1 et P2 pointent sur le mme objet.

B *P Le contenu de A est affect B


*P 20 Le contenu de A est mis 20

III- Pointeurs et tableaux

11

Adressage des composantes dun tableau

III- Pointeurs et tableaux

12

Arithmtique des pointeurs

le nom d'un tableau reprsente l'adresse de son premier lment

Affectation par un pointeur de mme type : Soient P1 et P2 deux pointeurs sur le mme type de

&tableau [0] tableau

donnes, alors l'instruction P1 = P2; fait pointer P1 sur le mme objet que P2

Le nom dun tableau reprsente un pointeur constant sur le premier lment du tableau
Exemple: soit un tableau A de type int et un pointeur p sur int
int A[10] / int *p
P = A quivalente P = &A[0]
Si P pointe sur une composante quelconque d'un tableau, alors P+1 pointe sur la composante suivante

Addition et soustraction dun nombre entier : Si P pointe sur l'lment A[i] d'un tableau, alors
P+n pointe sur A[i+n] et P-n pointe sur A[i-n]
Incrmentation et dcrmentation dun compteur : Si P pointe sur l'lment A[i] d'un tableau,
alors aprs l'instruction

P+i pointe sur la ime composante derrire P et


P-i pointe sur la ime composante devant P.

P++; P pointe sur A[i+1]

*(P+1) dsigne le contenu de A[1]

P--; P pointe sur A[i-1]

*(P+2) dsigne le contenu de A[2]

P+=n; P pointe sur A[i+n]

P-=n; P pointe sur A[i-n]

III- Pointeurs et tableaux

13

III- Pointeurs et tableaux

Arithmtique des pointeurs

14

Arithmtique des pointeurs

Domaine des oprations

Soustraction de deux pointeurs

L'addition, la soustraction, l'incrmentation et la dcrmentation sur les pointeurs sont


seulement dfinies l'intrieur d'un tableau. Si l'adresse forme par le pointeur et l'indice
sort du domaine du tableau, alors le rsultat n'est pas dfini.
Seule exception: Il est permis de 'pointer' sur le premier octet derrire un tableau (
condition que cet octet se trouve dans le mme segment de mmoire que le tableau)

Soient P1 et P2 deux pointeurs qui pointent dans le mme tableau

P1-P2 fournit le nombre de composantes comprises entre P1 et P2.


Le rsultat de la soustraction P1-P2 est ngatif si P1 prcde P2

Exemple

zro si P1 = P2

int A[10];
int *P;
P = A+9; /* dernier lment
lgal */
P = A+10; /* dernier lment + 1
lgal */
P = A+11; /* dernier lment + 2
illgal */
illgal */
P = A-1; /* premier lment - 1

positif si P2 prcde P1
indfini, si P1 et P2 ne pointent pas dans le mme tableau

Plus gnralement, la soustraction de deux pointeurs qui pointent dans le mme tableau est
quivalente la soustraction des indices correspondants.

III- Pointeurs et tableaux

15

16

1re Application

Arithmtique des pointeurs


Comparaison de deux pointeurs
On peut comparer deux pointeurs par <, >, <=, >=, ==, !=.
La comparaison de deux pointeurs qui pointent dans le mme tableau est quivalente la
comparaison des indices correspondants. (Si les pointeurs ne pointent pas dans le mme tableau,
alors le rsultat est donn par leurs positions relatives dans la mmoire).

Visualiser le contenu de A, B, C, P1 et P2 aprs chacune des instructions suivantes :


main()
{
int A =1;
int B = 2;
int C = 3;
int *P1, *P2;
P1 = &A;
P2 = &C;
*P1 = (*P2)++;
P1 = P2;
P2 = &B;
*P1-=*P2;
++*P2;
*P1*=*P2;
A=++*P2**P1;
P1=&A;
*P2=*P1/=*P2;
Return 0;
}

IV. Pointeurs et chaines de caractres

17

IV. Pointeurs et chaines de caractres

18

Pointeurs sur char et chanes de caractres constantes

Pointeurs sur char et chanes de caractres constantes

Initialisation

Affectation
On peut attribuer l'adresse d'une chane de caractres constante un pointeur sur char:

Un pointeur sur char peut tre initialis lors de la dclaration si on lui affecte l'adresse d'une
chane de caractres constante:

Exemple

char *B = "Bonjour !";

char *C;

Soient les deux dclarations suivantes :

C = "Ceci est une chane de caractres constante";

char A[] = Bonjour !;


char *B =Bonjour !;
A est un tableau qui a exactement la grandeur pour contenir la chane de caractres et la
terminaison '\0'. Les caractres de la chane peuvent tre changs, mais le nom A va
toujours pointer sur la mme adresse en mmoire.
B est un pointeur qui est initialis de faon ce qu'il pointe sur une chane de caractres
constante stocke quelque part en mmoire. Le pointeur peut tre modifi et pointer sur
autre chose. La chane constante peut tre lue, copie ou affiche, mais pas modifie.

V. Tableaux de pointeurs

19

Dclaration dun tableau de pointeurs


<Type> *<NomTableau>[<N>]
dclare un tableau <NomTableau> de <N> pointeurs sur des donnes du type <Type>.

Exemple double *A[10]; dclare un tableau de 10 pointeurs sur des rationnels du


type double dont les adresses et les valeurs ne sont pas encore dfinies.

Initialisation : Nous pouvons initialiser les pointeurs d'un tableau sur char par les adresses
de chanes de caractres constantes.

Exemple: char *jour[]={dimanche, lundi, mardi, mercredi, jeudi, vendredi,


samedi} dclare un tableau JOUR[] de 7 pointeurs sur char. Chacun des pointeurs est
initialis avec l'adresse de l'une des 7 chanes de caractres.

20

III- Paramtres dune fonction


1- Passage des paramtres par valeur
Algorithme PAR_VALEUR
VAR
X, Y : entier
Procdure PERMUTER (A, B : entier)
VAR
AIDE : entier
DEBUT
AIDE A
AB
B AIDE
crire ("Dans PERMUTER : A=" , A , "B= " , B)
FIN
DEBUT ( P.P )
A 30
B 40
crire ("Avant appel de PERMUTER : X=", X, "Y = " , Y)
PERMUTER ( X, Y )
crire ("Aprs appel de PERMUTER : X=", X, "Y = " , Y)
FIN

Excution :
Avant appel de PERMUTER :
X = 30
Y = 40
Dans PERMUTER :
A = 40
B = 30
Aprs appel de PERMUTER :
X = 30
Y = 40
X et Y restent changs.
-

Lors de lappel, les valeurs de X et Y sont copies dans les


paramtres A et B. PERMUTER change bien le contenu des variables
locales A et B, mais les valeurs de X et Y restent les mmes.
Pour changer la valeur dune variable de la fonction appelante,
nous allons procder comme suit :
La fonction appelante doit fournir ladresse de la variable et
La fonction appele doit dclarer le paramtre comme
pointeur.

21

III- Paramtres dune fonction


Passage des paramtres par adresse
Algorithme PAR_ADRESSE
VAR
X, Y : entier
Procdure PERMUTER (A, B : pointeur sur entier)
VAR
AIDE : entier
DEBUT
AIDE *A
*A *B
*B AIDE
crire ("Dans PERMUTER : A=" , *A , "B= " , *B)
FIN
DEBUT ( P.P )
X 30
Y 40
crire ("Avant appel de PERMUTER : X=", X, "Y = " , Y)
PERMUTER (&X, &Y)
crire ("Aprs appel de PERMUTER : X=", X, "Y = " , Y)
FIN

22

IV- Allocation dynamique de mmoire

Excution :
Avant appel de PERMUTER :
X = 30
Y = 40
Dans PERMUTER :
A = 40
B = 30
Aprs appel de PERMUTER :
X = 40
Y = 30

Pour rserver lespace mmoire pour un tableau ou une variable quelconque, on utilise souvent une
opration dallocation statique qui est effectu au dbut dun programme (section variables), cette manire
de rservation prsente linconvnient que lespace rserv doit tre connu lavance (constant)
Exemple
1- A, B : entier
C : rel

Lors de lappel, les adresse de X et Y sont copies dans les pointeurs A


et B. PERMUTER change ensuite le contenu des adresses indiques par
les pointeurs A et B.
Remarque
- Par dfaut lorsque lon dclare un pointeur, on ne sait pas sur quoi il
pointe. Comme toute variable, il faut linitialiser. On peut dire quun
pointeur ne pointe sur rien en lui affectant la valeur NULL
i : entier
p1, p2 : pointeur sur entier
p1 &i
p2 NULL

2- Type
TAB : Tableau [1..50] : dentier

23

IV- Allocation dynamique de mmoire

24

IV- Allocation dynamique de mmoire

A linverse lallocation dynamique permet de rserver un espace mmoire de taille

La fonction malloc

variable en milieu dexcution dun programme ce moment, on ne peut pas utiliser les

Dfinie dans la bibliothque alloc.h.

noms pour accder cette zone mmoire, on utilisera par suite les pointeurs.
On dispose deux primitives ALLOUER et LIBERER . La fonction ALLOUER permet de

Exemple :
char *pc;
int *pi,*pj,*pk;

rserver un ensemble de cases mmoires et envoyer ladresse de dbut de cette zone.

float *pr;

PTR ALLOUER (N)

pc = (char*)malloc(10);

/* rserve 10 cases mmoire 10 caractres */

N : nombre doctet rserver.

pi = (int*)malloc(16);

/* rserve 16 cases mmoire 4 entiers

*/

Une fois on na plus besoin de cette zone mmoire, on peut librer avec :

pr = (float*)malloc(24);

/* rserve 24 places en mmoire 6 rels

*/

LIBERER (PTR)

pj = (int*)malloc(sizeof(int));
pk = (int*)malloc(3*sizeof(int));

/* rserve la taille d'un entier en mmoire

*/

/* rserve la place en mmoire pour 3 entiers */

25

26

IV- Allocation dynamique de mmoire

2me

application

Soit P un pointeur qui 'pointe' sur un tableau A:


int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};

La fonction free

int *P;

Dfinie dans la bibliothque alloc.h. Elle permet de librer de la mmoire.


free(pi);

/* libre la place prcdemment rserve pour pi */

free(pr);

/* libre la place prcdemment rserve pour pr */

P = A;
Quelles valeurs ou adresses fournissent ces expressions:
a) *P+2
b) *(P+2)
d) &A[4]-3
e) A+3
f) &A[7]-P
g) P+(*P-10)
h) *(P+*(P+8)-A[7])

27

2me application: correction


*P+2

de l'alphabet en ne distinguant pas les majuscules et les minuscules. Utiliser un tableau ABC de dimension 26

34

&A[4]-3
A+3

Ecrire un programme qui lit une chane de caractres CH au clavier et qui compte les occurrences des lettres

14

*(P+2)

28

3me application

pour mmoriser le rsultat et un pointeur PCH pour parcourir la chane CH et un pointeur PABC pour parcourir

ladresse de la composante A[1]

ABC. Afficher seulement le nombre des lettres qui apparaissent au mois une fois dans le texte.

ladresse de la composante A[3]

&A[7]-P
P+(*P-10)

la valeur (indice) 7
ladresse de la composante A[2]

*(P+*(P+8)-A[7])

la valeur 23

Exemple:
Entrez un ligne de texte (max. 100 caractres) : Jeanne La chane "Jeanne" contient :
1 fois la lettre 'A'
2 fois la lettre 'E'
1 fois la lettre 'J'
3 fois la lettre 'N'