Professional Documents
Culture Documents
81
Chapitre 8
Mohamed N. Lokbani
v1.01
82
1. Dfinitions
- La notion de pointeur est spcifique aux langages C et C++.
- Une adresse est un emplacement donn en mmoire.
- Un pointeur est une variable qui contient ladresse dune autre variable de nimporte quel type.
- La syntaxe (dclaration ou dfinition) est comme suit :
Type *identificateur ;
Ou bien
Type* identificateur ;
int *ptr ;
- Le pointeur ptr contient ladresse mmoire dune zone mmoire capable de contenir une variable de
type int
- La dfinition dun pointeur nalloue en mmoire que la place mmoire ncessaire pour stocker ce
pointeur et non pas ce quil pointe !
- Il est prfrable dinitialiser le pointeur avant de lutiliser sinon bonjour les dgts !
- Un pointeur sur un type void pointe une zone sans type.
void *ptr ;
Mohamed N. Lokbani
v1.01
83
int main() {
int i = 99;
int *ptr; // dclaration
ptr = &i; // initialisation
return 0;
}
Adresse
mmoire
Contenu
mmoire
Variables
15478
13256
ptr
13256
99
Mohamed N. Lokbani
v1.01
84
- Loprateur unaire dindirection * permet dobtenir la valeur dun lment ( drfrencer ) dont
ladresse est contenue dans le pointeur.
int i=99 ;
int *ptr ;
ptr = &i ;
*ptr = *ptr + 1; ( i=i+1) On incrmente le contenu de ptr de 1.
(*ptr)++; ( i++)
int *ptr=NULL ;
if(ptr == NULL)
cout << "Attention, pointeur NUL \n" ;
Mohamed N. Lokbani
v1.01
85
- On peut casser le lien entre pointeur et llment point. Le dbut de la fin ! Catastrophes lhorizon !
- Le pointeur est dtruit mais pas l'lment point. Si rien ne pointe plus sur lui, on peut perdre sa trace
dans la mmoire de l'ordinateur... des fuites de mmoire une sacre passoire !
- L'lment point peut disparatre alors que le pointeur continue de pointer sur lui ! Ae ! Risque important
de plantages alatoires.
- Initialiser systmatiquement les variables de type pointeur.
2. Pointeurs et Tableaux
- Les tableaux sont en ralit des pointeurs.
- Le nom d'un tableau est un pointeur constant sur le premier lment de celui-ci.
- En C++, une chane de caractres est considre comme un tableau de caractres dont le dernier lment
est le caractre \0 .
- Quand on travaille sur un tableau, on a le choix dutiliser un indice ou bien travailler avec un pointeur.
Mohamed N. Lokbani
v1.01
86
ptab contient
ladresse de
llment se
trouvant lindex
0 ptab = tab ;
Mohamed N. Lokbani
v1.01
87
Mohamed N. Lokbani
v1.01
88
Mohamed N. Lokbani
v1.01
89
Colonnes
0
1
Lignes
0
1
5
1
2
6
2
3
7
3
4
8
Mohamed N. Lokbani
v1.01
..
90
1ere colonne
..
2e colonne
dtab
Mohamed N. Lokbani
v1.01
91
5. Tableau de pointeurs
- Soit la dfinition suivante :
char tab[10][20] ;
un tableau de chane de caractres : 300 caractres
- Si chaque caractre occupe 1 octet en mmoire, cette dfinition rserve 300 octets en mmoire.
- On peut dfinir un tableau de pointeurs sur des chanes de caractres comme suit :
char *tab[10] ;
un tableau de 10 pointeurs sur des chanes de caractres.
Mohamed N. Lokbani
v1.01
92
C o
\0
tab[0]
I
F T 1
\0
tab[1]
tab[2]
C + + \0
Mohamed N. Lokbani
v1.01
93
6. Allocation mmoire
- Loprateur new permet une allocation dynamique de lespace mmoire.
- Loprateur delete permet de librer la mmoire alloue.
Langage
C
C++
Java
allouer
malloc
new
new
supprimer
free
delete
--------
new T
new T[DIM]
supprimer
delete P
delete [] P
- new T(valeur) allocation d'un pointeur de type T* non nul et initialisation du pointeur avec valeur
(valable uniquement pour un lment).
Mohamed N. Lokbani
v1.01
94
#include <iostream>
int main() {
double* ptr;
*ptr = 126789.89;
tab[5] = 78;
delete ptr;
delete autre;
delete [] tab;
return 0;
}
Mohamed N. Lokbani
v1.01
95
7. Constantes et pointeurs
- La valeur d'une constante ne peut pas tre modifie.
- Ladresse d'une constante ne peut pas tre affecte une variable.
1er cas de figure
const int j=100;
j=50;
int* ptr;
ptr=&j;
Mohamed N. Lokbani
v1.01
96
2e cas de figure
const int* ptr;
ptr = &j;
*ptr=200;
OK
Erreur car on tente de modifier la
valeur pointe par ptr qui est une
constante!
int k=30;
ptr = &k;
OK
3e cas de figure
int a = 10;
int* const ptr = &a;
variable pointe
int b = 20;
Mohamed N. Lokbani
ptr = &b;
*ptr = 400;
v1.01
97
4e cas de figure
int i=20;
const int j=10;
const int* const ptr = &j;
valeur constante
Erreur, on tente de modifier la valeur
de j qui est constante
*ptr=30;
ptr=&i;
Mohamed N. Lokbani
v1.01
98
8. Conversion de pointeurs
- Type void* dnote un pointeur quelconque.
- Ansi-C permet de convertir implicitement:
type* void*
et
void* type*
- En C++,
La conversion void* type* est INTERDITE.
Mohamed N. Lokbani
v1.01
99
int* p;
void* v;
v = p;
p = v;
Le compilateur n'a aucune information pour interprter le contenu de la variable afin de la convertir.
Le compilateur ne connat pas le nombre prcis d'octets auquel le pointeur rfre.
Dans le cas d'un pointeur vers void, il ne peut pas dterminer le nombre d'octets partir du type.
Il est ncessaire de faire un cast explicite, i.e.:
p = (int*) v;
criture la C
(valable en C++)
Nouveau style
(non valable en C)
Mohamed N. Lokbani
v1.01
100
9. Conversion de type
- Nous avons dj mentionn les 4 nouveaux oprateurs introduits en C++ pour permettre de forcer la
conversion de type.
9.1. static_cast
- En plus des proprits prcdemment mentionnes, il peut effectuer aussi les oprations de conversion
standard de void* vers un int* par exemple.
- Par contre, cet oprateur ne permet le forage de types const vers non const ainsi que le forage de
types sans relation.
const int x = 8;
int *p = static_cast <int *> (&x);
int j =250;
int *p = static_cast <int *> (j);
Mohamed N. Lokbani
v1.01
101
9.2. const_cast
- Cet oprateur permet uniquement la conversion de types const vers non const.
const int x = 8;
int *p = const_cast <int *> (&x);
int y = 8;
int *r = const_cast <int *> (&y);
double yz = 8.7;
int *rr = const_cast <int *> (&yz);
Mohamed N. Lokbani
v1.01
102
9.3. reinterpret_cast
- Cet oprateur est utilis essentiellement pour la conversion de types de relation diffrente (non standard),
int et int*, void* et int etc.
- Il ne permet pas la conversion const vers non const.
int j =250;
int *p = reinterpret_cast <int *> (j);
Mohamed N. Lokbani
v1.01