Sunteți pe pagina 1din 14

Murielle TORREGROSSA

LES POINTEURS

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa

Gnralits
Une variable de type pointeur est une variable dont
la valeur est l'adresse d'un objet.
Dfinition de variable de type pointeur :
<nom_de_type> *<nom_de_variable> ;

Exemple :
char *pc ; // pc est une variable de type pointeur de char
int *pi ; // pi est une variable de type pointeur de int
short *ps ; // ps est une variable de type pointeur de short

La valeur de la variable pc (aprs affectation) est


l'adresse d'un objet de type char.
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
2

Architecture des ordinateurs 1


Murielle TORREGROSSA

Oprateurs adresse & et contenu *


Syntaxe :
&<nom_de_variable>
La valeur de cette expression est l'adresse de la
variable. Le type de cette expression est :
pointeur de <type de la variable > .

Syntaxe:
*<expression_de_type_pointeur>
La valeur de cette expression est le contenu de
la zone mmoire adresse par l'<expression
de type pointeur>.
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
3

Oprateur adresse &


Exemple :
char c , *pc ;
pc = &c ; // l'adresse de la var. c est stocke dans pc

Attention , les critures suivantes sont fausses:


&(x+3) &3

Exemple :
int x = 5 , y , *pi ;
pi = &x ; //pi aura pour valeur l'adresse de la variable x
x 5
pi
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
4

Architecture des ordinateurs 2


Murielle TORREGROSSA

Oprateur contenu *
Exemples :

int x = 5 , y , *pi ;
pi = &x ; /*pi aura pour valeur l'adresse de la var. x */
y = *pi + 1 ; /* la variable y aura pour valeur 6 */
*pi = 4 ; /* la variable x aura pour valeur 4 */
*pi = *pi +1; /* la variable x aura pour valeur 5 */
(*pi)++; /* la variable x aura pour valeur 6 */

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
5

Oprateur contenu *
Remarques :
Si p est une variable de type pointeur, les
expressions p et *p sont des "lvalue" .
Les variables p et *p peuvent tre places
gauche de l'oprateur d'affectation.

La dfinition int *pi ; ne rserve pas un


emplacement pour un entier.
La valeur de la variable pi est indtermine aprs
sa dfinition.

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
6

Architecture des ordinateurs 3


Murielle TORREGROSSA

Pointeurs et fonctions

Nous avons vu que, lorsque les paramtres


formels correspondent des variables
scalaires, l'appel se fait par valeur (pas de
modification des paramtres d'appel par la
fonction) .

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
7

Pointeurs et fonctions
Exemple :
main( ) {
int a = 3 , b = 5 ; // 3 b a 5
swap (a , b) ; // appel par valeur
}

void swap ( int x , int y ) {


int z ; // x 3 y 5
z=x; // puis modification
x=y; // uniquement des paramtres
y=z; // formels
}
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
8

Architecture des ordinateurs 4


Murielle TORREGROSSA

Pointeurs et fonctions

Pour que la fonction puisse modifier le


contenu des variables d'appel , on utilisera
des paramtres formels de type pointeur.

Il y a toujours appel par valeur , mais la valeur


du paramtre d'appel (&a) est une adresse
(pointeur de int).
Cette adresse est recopie dans la zone
correspondante du paramtre formel px , qui
est lui aussi de type pointeur de int.
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
9

Pointeurs et fonctions
Exemple :
main() {
int a = 3 , b = 5 ; // a 3 b 5
swap (&a , &b) ;
}
void swap (int *px , int *py) {
int z ; // px &a py &b
z = *px ;
*px = *py ;
*py = z ;
}
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
10

Architecture des ordinateurs 5


Murielle TORREGROSSA

Pointeurs et noms de tableaux


La dfinition: short a[10] ; correspond la
rservation de 10 emplacements mmoire
conscutifs dsigns respectivement par :
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

Considrons les instructions suivantes :


short *pa ; // pa est une var. de type pointeur de short
pa = &a[0] ; // stocke dans pa l'adresse du 1er lment
// du tableau a
pa = &a[i] ; // stocke dans pa l'adresse de l'lment
// d'indice i du tableau a

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
11

Pointeurs et noms de tableaux


Dfinition :
Si la variable pa de type pointeur de short
contient l'adresse d'un lment particulier
a[i] du tableau de short a , alors:
z pa+1 "pointe" sur l'lment a[i+1] cd l'lment
suivant
z pa-1 "pointe" sur l'lment a[i-1] cd l'lment
prcdent
z pa+k "pointe" sur l'lment a[i+k] (le kme
lment aprs a[i] ).

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
12

Architecture des ordinateurs 6


Murielle TORREGROSSA

Les oprateurs + et -
Les oprateurs + ou - , avec comme
oprandes un pointeur et un entier, ne sont
pas les oprateurs + ou - ordinaires.
Les oprateurs + ou - dpendent du type de
l'objet point.
D'aprs la dfinition prc., si pa = &a[i] ; alors:
z *pa dsigne le contenu de a[i]
z *(pa+1) dsigne le contenu de a[i+1]
z *(pa+k) dsigne le contenu de a[i+k]
Il y a une correspondance trs troite entre la notation
indice et l'arithmtique des pointeurs.
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
13

Les oprateurs + et -

Dfinition :
Le nom d'un tableau est une constante de
type pointeur de type gal au type des
lments du tableau.

Cette constante a pour valeur l'adresse du


premier lment du tableau.

Ce n'est pas une lvalue.

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
14

Architecture des ordinateurs 7


Murielle TORREGROSSA

Les oprateurs + et -
Exemple :
int t[20] ; // t est une constante de type pointeur de int
// gale l'adresse de t[0].
Par consquent :
z l'expression t a pour valeur l'adresse de l'lment t[0]
z l'expression t+1 a pour valeur l'adresse de l'lment t[1]
z l'expression t+i a pour valeur l'adresse de l'lment t[i]
donc :
t+i <=> &t[i]
*(t + i) <=> t[i]

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
15

Remarque 1
La mme quivalence est valable pour les
variables de type pointeur.

Exemple :
Soit :
char a[20] , *pa ;
pa = a ;

alors :
*(pa+i) <=> pa[i]
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
16

Architecture des ordinateurs 8


Murielle TORREGROSSA

Remarque 2
Considrons les dfinitions
char *pa , a[30] ;

z pa est une variable, donc:


pa = a ; // Correct !!
pa++ ; // Correct !!

z le nom de tableau a est une constante (a dsigne


toujours l'adresse de l'lment a[0]), donc:
a = pa ; // Faux !!
a++ ; // Faux !!
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
17

Remarque 3
Quand un nom de tableau est fourni comme
paramtre d'appel une fonction, c'est la
valeur de ce nom (c'est dire l'adresse du 1er
lment du tableau) qui est transmise et
stocke dans la zone correspondant au
paramtre formel (qui doit tre de type
pointeur).

La transmission des paramtres est toujours


une transmission par valeur.

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
18

Architecture des ordinateurs 9


Murielle TORREGROSSA

Exemple : Rcriture de la fonction strlen

int strlen ( char *s ) {


int i = 0 ;
while ( *(s+i) != '\0')
i++ ;
return i; s
}

main() {
char a[12] ; a I | U | T | \0 | .. |
int n ;
printf ("introduire la chaine : ") ;
scanf ("%s", a) ;
n = strlen(a) ;
printf ("longueur de la chaine : %d\n" , n) ;
}

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
19

Exemple : Rcriture de la fonction strlen

En appliquant l'quivalence entre notation


pointeur et notation indice *(pa+i) <=> pa[i] ,
la fonction strlen peut encore s'crire :

int strlen ( char *s ) {


int i = 0 ;
while( s[i] != '\0')
i++ ;
return i ;
}

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
20

Architecture des ordinateurs 10


Murielle TORREGROSSA

Exemple : Rcriture de la fonction strlen

Pour se rapprocher d'avantage de la notation


indice, le langage C permet de remplacer la
dfinition du paramtre formel :
int strlen ( char *s )

par l'criture quivalente suivante :


int strlen ( char s[ ] )

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
21

Exemple : Rcriture de la fonction strlen

La fonction strlen s'crit alors:

int strlen ( char s[ ] ) {


int i = 0 ;
while ( s[i] != '\0 )
i++ ;
return i ;
}

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
22

Architecture des ordinateurs 11


Murielle TORREGROSSA

Exemple : Rcriture de la fonction strcpy

strcpy copie la chane de caractres stocke


dans le tableau t dans le tableau s

void strcpy ( char *s, char *t) {


while ( ( *s = *t ) != '\0') {
s++ ;
t++ ;
}
}

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
23

Exemple : Rcriture de la fonction strcpy

Ce qui peut encore s'crire :

void strcpy ( char *s, char *t) {


while ( ( *s++ = *t++ ) != '\0') ;
}

ou encore:

void strcpy ( char *s, char *t) {


while ( *s++ = *t++ ) ;
}

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
24

Architecture des ordinateurs 12


Murielle TORREGROSSA

Constantes chane de caractres et pointeurs

L'criture dans un source C d'une constante


chane de caractres ( par exemple "abcd")
correspond une constante de type pointeur
de char non explicite dont la valeur est gale
l'adresse du premier lment d'un tableau
de char contenant la chane de caractres.

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
25

Constantes chane de caractres et pointeurs

Exemple 1 :

La constante "abcd" est transforme par le


compilateur en :
a b c d \0
(constante de type pointeur de char non
explicite)

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
26

Architecture des ordinateurs 13


Murielle TORREGROSSA

Constantes chane de caractres et pointeurs

Exemple 2 :
Soit :
char s[20] , *t ;
z l'instruction t = "abcd" ; est correcte
z l'instruction s = "abcd" ; est fausse
z l'instruction strcpy ( s , "abcd" ) ; est correcte
z l'instruction strcpy ( t , "abcd" ) ; est correcte
condition que la valeur de la variable t soit
gale l'adresse d'un tableau d'au moins 5 char.

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa
27

Remarque
Le seul cas o une constante chane de caractres
n'est pas considre par le compilateur comme
un pointeur constant de type char est celui de
l'initialisation d'un tableau de char lors de sa
dfinition.

Au lieu d'crire par exemple :


char a[10] = {'I' , 'U', 'T', '\0 };
on peut crire de manire quivalente
char a[10] = "IUT";
Dans ce seul cas, "IUT" est considre comme
une numration de caractres {'I', 'U', 'T', '\0'}.
IUT R. Schuman Strasbourg
R. Stutzman, M. Torregrossa
28

Architecture des ordinateurs 14

S-ar putea să vă placă și