chapitre 8

Les pointeurs

 

1-    Notion d’adressage :

 

La mémoire est composée par des cases mémoire, chacune de ses derniers est identifié par un numéro appelé adresse.

 

On peut donc accédé à une variable de deux façons :

·        Par nom de cette variable

·        Par adresse

 

10

100  A  

  On suppose qu’on à la variable A portant comme valeur 10 et d’adresse 100.

1* adressage direct :

 

(Classique) c’est accédé au contenue d’une variable par son nom.

 

2* adressage indirect :

 

C’est le faite d’accédé au contenue d’une variable on passant par une autre variable spéciale qui contient l’adresse de la variable de début.

 

Exemple :

 

10

100  A  

 

è On construit un variable qui porte la valeur 100(adresse de notre valeur).

Par exemple p

100

p

On aura ;

 

p

 

10

100  A  

 

2-  Notion de pointeur :

 

1* Définition :

 

Un pointeur est une variable spéciale (déjà énoncé dans l’accès indirect) contenant l’adresse d’une autre variable d’un type donné.

 

Si un pointeur p contient l’adresse d’une variable A on dit alors que p pointes sur A ou p est l’adresse de A.

 

 

 

p

10

               

                   100  A  

 

2* déclaration :

 

Pour déclaré un pointeur on doit écrire le type de la variable sur la qu’elle il pointera suivie du caractère * pour préciser que c’est un pointeur puis enfin son nom.

 

Syntaxe :

 

Type* nom_pointeur ;

 

è Le type c’est liée à la valeur principale A.

è * est relié au nom du pointeur.

Remarque :

Cas entier : 4 octets

100

104

 P                   p++ ; (p=p+1)             p                                                                   

 

3* les opérateurs de bases :

 

a-    L’opérateur d’adressage : &

 

Pour avoir l’adresse mémoire d’une variable il faut utiliser l’opérateur d’adressage(&).

 

Ainsi ; &A fourni l’adresse de la variable A.

 

 

Exemple :

 

int A=2 ;

int *p ;

p=&A ;  /*p pointe sur A c'est-à-dire il à son adresse*/

 

b-   Opérateur contenue :

 

Pour accédé au contenue à l’adresse mémoire d’une variable pointé par un pointeur p, il faut utiliser l’opérateur * ainsi ; *p désigne le contenus de l’adresse refermée par p (contenue de A).

 

3-  Pointeur et tableau :

 

Soit T nom d’un tableau.

En langage c ; T est l’adresse du 1ére élément du tableau c’est à dire que :

Tó&T [0]

 T est donc un pointeur constant sur le 1ére élément du tableau.

è T+i : l’adresse de T[i] (élément iéme du tableau).

è *(T+i) : T[i]

 

4- Opérations sur les pointeurs :

 

1* arithmétique de pointeur :

 

On peut désormais déplacer un pointeur à l’aide des opérateurs (addition, soustraction, incrémentation (++) et décrémentation (--)).

è On ne peut pas déplacer un pointeur un nombre de case mémoire dépassant la taille des cases réservé par la variable sur la quel il pointe.

 

Exemple :

 

Cas entier : 4 octets

100

104

 P                   p++ ; (p=p+1)             p                                                                   

 

Avec

Sur 4 octets

100     101     102     103                                      (A)

100 : adresse de A, d’elle je peux s’avoir les autres (il suffit d’avoir 100 et le pointeur pointe sue cette valeur).

 

Remarque :

 

·        Dans le reste des chapitre on va s’avoir l’utilité de se travail.

·        Pour qu’un pointeur pointe nulle part il faut lui associé la valeur numérique nulle

int *p ;  p=0 ;

·        L’affectation d’un pointeur vers un autre veut dire que les deux pointeurs pointent sur la même objet.

 

Int A ;                                                           p

                                                                       q                           A

Int *p,*q ;

P=q ;

 

·        Si p porte (pointe) sur T[i] (p=&T[i]) alors p+n=&(T[i+n]) et

p-n=&(T [i-n]).

·        Si p porte (pointe) sur T[i] (p=&T[i]) alors p++=&(T[i++])

·        Si p1 et p2 pointent dans un même tableau alors :

 

è p1-p2 donne le nombre des composantes entre p1 et p2.

è La comparaison de p1 et p2 est équivalente à la comparaissant des indices correspondantes.

 

5-  Allocation dynamique du mémoire :

 

C’est le fait de réservé des zone dans la mémoire d’un taille donné.

Pour ce la il faut utiliser la fonction malloc définie en c qui permet l’allocation d’une place en mémoire à un pointeur.

Cette fonction est utilisé dés quand parle du pointeur.

 

Syntaxe :

 

Nom_pointeur=(type*)malloc(size) ;

 

Size=taille quand veut réserver en mémoire (mesuré en se type : entier=4 octet si je donne 10 -> 10*4=40 octets).

 

Exemple :

 

int *p ; /* cette écriture veux dire :  int p[4] ; */

P=(int*)malloc(10) ;

 

6- Libération mémoire :

 

On peut libérer des zones mémoire déjà réservé après un certain travail fini.

C’est la fonction free qui assure ce travail.

 

Syntaxe :

 

free(nom_pointeur) ; /* libérer l’espace réservé par la fonction malloc */

 

7-  Passage des paramètres dans une fonction :

 

Il existe deux types de passage :

 

a-    Passage par valeur :

 

Les fonctions obtiennent les valeurs de leur paramètre et non pas d’accès au variable.

 

On peut donc changé les valeurs des paramètres fournis sans modifier les valeurs originales dans la fonction appelante.

 

Exemple :

 

void echange(int a,int b)

{

int c ;

c=a ;

a=b ;

b=c ;

}

Void main() /*fonction appelante*/

{

int  x,y ;

printf("donner x puis y") ;

Pour me contacté : mahfoudhighaieth2007@yahoo.fr