[x]

OFPPT Maroc

Guide des formations professionnelles

Vous avez téléchargé 0 fois ce fichier durant les dernières 24 heures. La limite est fixée à 5 téléchargements.
Vous avez téléchargé 0 fichier(s) durant ces 24 dernières heures. La limite est fixée à 5 téléchargements.

Cours de programmation II : pointeurs et allocation memoire

Télécharger

Cours de programmation II : pointeurs et allocation mémoire

1. Définitions

- La notion de pointeur est spécifique aux langages C et C++.

- Une adresse est un emplacement donné en mémoire.

- Un pointeur est une variable qui contient l’adresse d’une autre variable de n’importe quel type.

- La syntaxe (déclaration ou définition) est comme suit :

Type *identificateur ;

Ou bien

Type* identificateur ;

int *ptr ;

- Le pointeur « ptr » contient l’adresse mémoire d’une zone mémoire capable de contenir une variable de type « int »

- La définition d’un pointeur n’alloue en mémoire que la place mémoire nécessaire pour stocker ce pointeur et non pas ce qu’il pointe !

- Il est préférable d’initialiser le pointeur avant de l’utiliser sinon bonjour les dégâts !

- Un pointeur sur un type « void » pointe une zone sans type.

void *ptr ;

…

- L’opérateur unaire « & » fournit l’adresse en mémoire d’une variable donnée.

- Il permet donc d’initialiser la valeur d’un pointeur.

int i=99 ; Une zone mémoire sera réservée pour contenir la variable « i ». Cette zone mémoire va avoir un emplacement, par exemple « 13256 ». La variable « i » contient une valeur « 99 ».

Cette valeur est stockée dans cet emplacement mémoire.

int *ptr ; Une zone mémoire sera réservée pour contenir la variable « ptr » qui est un pointeur sur un « int ». Cette zone mémoire va avoir un emplacement, par exemple « 15478 ». La variable « ptr » va contenir l’adresse d’un élément du type

« int ».

&i; correspond à l’emplacement mémoire de « i » = 13256

ptr = &i; = 13256

- L’opérateur unaire d’indirection « * » permet d’obtenir la valeur d’un élément (« déréférencer ») dont l’adresse est contenue dans le pointeur.

int i=99 ;

int *ptr ;

ptr = &i; ;

*ptr = *ptr + 1; ( i=i+1) On incrémente le contenu de « ptr » de 1.

(*ptr)++; ( i++)

- Attention : ne pas confondre entre déclaration et déréférencement. Pour déréférencer un pointeur, il faudrait qu’il en existe déjà. Si un pointeur existe, penser à l’initialiser sinon catastrophes en vue !

- La constante « NULL » définit la valeur d’un pointeur ne pointant sur rien.

- Sa valeur est l’entier « 0 ».

- Elle est utilisée pour des raisons de lisibilité et de sécurité.

int *ptr=NULL ;

if(ptr == NULL)

cout << 'Attention, pointeur NUL \n' ;

- On peut « casser » le lien entre pointeur et l’élément pointé. Le début de la fin ! Catastrophes à l’horizon !

- Le pointeur est détruit mais pas l'élément pointé. Si rien ne pointe plus sur lui, on peut perdre sa trace dans la mémoire de l'ordinateur... des fuites de mémoire … une sacrée passoire !

- L'élément pointé peut disparaître alors que le pointeur continue de pointer sur lui ! Aïe ! Risque important de plantages aléatoires.

- Initialiser systématiquement les variables de type pointeur.

2. Pointeurs et Tableaux

- Les tableaux sont en réalité des pointeurs.

- Le nom d'un tableau est un pointeur constant sur le premier élément de celui-ci.

- En C++, une chaîne de caractères est considérée comme un tableau de caractères dont le dernier élément est le caractère « \0 ».

- Quand on travaille sur un tableau, on a le choix d’utiliser un indice ou bien travailler avec un pointeur.

…

3. Arithmétique des pointeurs

- L’incrémentation (resp. décrémentation) exprime le fait qu’on veuille atteindre l’élément suivant (resp. précédent).

- Le résultat n’est correct que si l’élément pointé est situé dans le même tableau.

int *ptr ;

ptr++;

ptr = ptr+1 ;

- L’addition de deux pointeurs n’a pas de sens.

- La soustraction de deux pointeurs (ayant le même type) situés dans le même tableau retourne le nombre d’éléments qui les séparent.

- Un pointeur ne peut être comparé qu’à un pointeur du même type ou un pointeur NULL.

- On ne doit affecter à un pointeur qu’une valeur de pointeur ayant le même type sinon bonjour les dégâts.

On ne saura plus qui est quoi et où ? La magie des pointeurs !!!

4. Les tableaux et les chaînes

- Un tableau de chaîne de caractères peut être initialisé de la manière suivante:

char msg[] = 'Bonjour' ;

char msg[] = {'B', 'o', 'n', 'j', 'o', 'u', 'r', '\0'} ;

- La dimension du tableau « msg » est facultative.

- Elle est calculée par le compilateur.

- Le compilateur place ce genre de tableaux (dont il se charge de calculer leur taille) dans une zone mémoire statique. Il faut faire donc attention lors de la modification du contenu de ce genre de tableaux.

(Ce cas sera illustré dans une des séances de démonstration).

- En dehors de la déclaration, il n’est pas possible d’affecter une chaîne de caractères à un tableau.

- Il faut passer par des fonctions appropriées. (Elles seront d’ailleurs étudiées plus tard dans le cours).

char msg[15] ;

msg = 'Bonjour' ; // INCORRECT

Evaluation :
Total des Votes : 0
Soyez le premier à écrire un commentaire sur ce fichier!
Veuillez vous identifier ou vous enregistrer.