Académique Documents
Professionnel Documents
Culture Documents
Point Eurs
Point Eurs
Les pointeurs
1
Souheib Baarir
1
Université Paris Ouest Nanterre La Défense.
Souheib.baarir@u-paris10.fr
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Dénition
On appelle Lvalue (left value) toute expression du langage pou-
vant être placé à gauche d'un opérateur d'aectation.
Dénition
On appelle Lvalue (left value) toute expression du langage pou-
vant être placé à gauche d'un opérateur d'aectation.
Caractérisation
Une Lvalue est caractérisée par :
Dénition
On appelle Lvalue (left value) toute expression du langage pou-
vant être placé à gauche d'un opérateur d'aectation.
Caractérisation
Une Lvalue est caractérisée par :
Remarque
L'adresse d'une lvalue est un entier (16 bits, 32 bits ou 64 bits)
et ce quelque soit le type de la valeur de lvalue.
L'opérateur adresse
Pour acceder à l'adresse d'une variable (lvalue) nous disposons
de l'opérateur unaire &.
Par l'exemple :
int i ;
p r i n t f ( " l ' a d r e s s e de i = %l d " ,& i ) ;
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Dénition
Un pointeur est une lvalue dont la valeur est égale à l'adresse
d'une autre lvalue.
Dénition
Un pointeur est une lvalue dont la valeur est égale à l'adresse
d'une autre lvalue.
Déclaration
type *nomPointeur (où type est le type de l'élément pointé).
Dénition
Un pointeur est une lvalue dont la valeur est égale à l'adresse
d'une autre lvalue.
Déclaration
type *nomPointeur (où type est le type de l'élément pointé).
Exemple :
i n t i =3;
i n t ∗p ;
p = &i ;
Dénition
Un pointeur est une lvalue dont la valeur est égale à l'adresse
d'une autre lvalue.
Déclaration
type *nomPointeur (où type est le type de l'élément pointé).
Exemple :
Problème
Comment peut-on accéder directement à l'element pointé par la
valeur d'un pointeur ?
Solution
Utilisation d'un nouvel opérateur unaire : *
Exemple :
i n t i =3;
i n t ∗p ;
p = &i ;
p r i n t f ( " La v a l e u r de ∗ p = %d" , ∗ p ) ;
int int
main ( i n t a r v , char ∗ a r g [ ] ) main ( i n t a r v , char ∗ a r g [ ] )
{ {
i n t i =3, j =6; i n t i =3, j =6;
i n t ∗ p1 , ∗ p2 ; i n t ∗ p1 , ∗ p2 ;
p1 = & i ; p1 = & i ;
p2 = &j ; p2 = &j ;
∗ p1=∗ p2 p1=p2 ;
} }
int int
main ( i n t a r v , char ∗ a r g [ ] ) main ( i n t a r v , char ∗ a r g [ ] )
{ {
i n t i =3, j =6; i n t i =3, j =6;
i n t ∗ p1 , ∗ p2 ; i n t ∗ p1 , ∗ p2 ;
p1 = & i ; p1 = & i ;
p2 = &j ; p2 = &j ;
∗ p1=∗ p2 p1=p2 ;
} }
int int
main ( i n t a r v , char ∗ a r g [ ] ) main ( i n t a r v , char ∗ a r g [ ] )
{ {
i n t i =3, j =6; i n t i =3, j =6;
i n t ∗ p1 , ∗ p2 ; i n t ∗ p1 , ∗ p2 ;
p1 = & i ; p1 = & i ;
p2 = &j ; p2 = &j ;
∗ p1=∗ p2 p1=p2 ;
} }
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
I l'expression p
0 =p+i (resp. p
0 = p − i) désigne un pointeur
sur un element de type type ,
I la valeur de p
0 est égale à la valeur de p incrémenté (resp.
décrémenté) de i ∗ sizeof (type ).
int
main ( i n t a r v , char ∗ a r g [ ] ) {
i n t i =5;
i n t ∗ p1 , ∗ p2 ;
p1 = & i + 2 ;
p2 = p1 − 2 ;
}
S i & i = 4830000 a l o r s :
I l'expression p
0 =p+i (resp. p
0 = p − i) désigne un pointeur
sur un element de type type ,
I la valeur de p
0 est égale à la valeur de p incrémenté (resp.
décrémenté) de i ∗ sizeof (type ).
int
main ( i n t a r v , char ∗ a r g [ ] ) {
i n t i =5; Lvalue Adresse Valeur
i n t ∗ p1 , ∗ p2 ;
i 4830000 5
p1 = & i + 2 ;
p1 4830004 4830008
p2 = p1 − 2 ;
} p2 4830008 4830000
S i & i = 4830000 a l o r s :
I l'expression − q désigne
p un entier dont la valeur est :
(p − q )/sizeof (type ),
int
main ( i n t a r v , char ∗ a r g [ ] ) {
i n t i =5;
i n t ∗ p1 , ∗ p2 ;
p1 = & i + 2 ;
p2 = p1 − 2 ;
i n t j = p2 − p1 ;
}
S i & i = 4830000 a l o r s :
I l'expression − q désigne
p un entier dont la valeur est :
(p − q )/sizeof (type ),
int
main ( i n t a r v , char ∗ a r g [ ] ) {
i n t i =5; Lvalue Adresse Valeur
i n t ∗ p1 , ∗ p2 ; i 4830000 5
p1 = & i + 2 ;
p1 4830004 4830008
p2 = p1 − 2 ;
p2 4830008 4830000
i n t j = p2 − p1 ;
} j 4830016 2
S i & i = 4830000 a l o r s :
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
Dénition
L'allocation dynamique est l'opération qui consiste à réserver un
espace-mémoire d'une taille dénie.
i n t main ( i n t a r v , char ∗ a r g [ ] ) {
i n t i = 3 , ∗p ;
p = ( i n t ∗) malloc ( sizeof ( i n t ) ) ;
∗p = i ;
}
i n t main ( i n t a r v , char ∗ a r g [ ] ) {
i n t i = 3 , ∗p ;
p = ( i n t ∗) malloc ( sizeof ( i n t ) ) ;
∗p = i ;
}
i n t main ( i n t a r v , char ∗ a r g [ ] ) {
i n t i = 3 , ∗p ;
p = ( i n t ∗) malloc ( sizeof ( i n t ) ) ;
∗p = i ;
}
Dénition
C'est l'opération qui consiste à libérer l'espace-mémoire alloué.
void free(nomPointeur)
I Tout espace-mémoire alloué dynamiquement via malloc (ou
équivalent) doit obligatoirement être désalloué par free, sinon
nous rencontrons le fameux problème de fuite mémoire
(memory leak).
Introduction
Les pointeurs
Dénition des pointeurs
Arithmétique des pointeurs
Allocation dynamique
Pointeurs et tableaux
À retenir
Tout tableau en C est en fait un pointeur constant !
Soit int tab[N] un tableau alors tab est un pointeur constant qui
a pour valeur &tab[0].
À retenir
Tout tableau en C est en fait un pointeur constant !
Soit int tab[N] un tableau alors tab est un pointeur constant qui
a pour valeur &tab[0].
i n t main ( i n t a r v , char ∗ a r g [ ] ) {
i n t tab [5]={1 ,2 ,3 ,4 ,5};
i n t i , ∗p ;
p = tab ;
f o r ( i =0 ; i <5 ; ++i )
p r i n t f ( " ∗ ( p+i ) = %d = p [ i ] = %d = t a b [ i ] = %d \n" ,
∗ ( p+i ) , p [ i ] , t a b [ i ] ) ;
}