La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Plan cours La notion de pointeur et dadresse mémoire. Le passage de paramètres par adresse (ou référence). Pointeur sur un tableau. La notion dallocation.

Présentations similaires


Présentation au sujet: "Plan cours La notion de pointeur et dadresse mémoire. Le passage de paramètres par adresse (ou référence). Pointeur sur un tableau. La notion dallocation."— Transcription de la présentation:

1 Plan cours La notion de pointeur et dadresse mémoire. Le passage de paramètres par adresse (ou référence). Pointeur sur un tableau. La notion dallocation dynamique. malloc, realloc, calloc free Les erreurs classiques de lutilisation dadresses.

2 La notion de pointeur et dadresse Chaque variable définie se trouve à une adresse numérique en mémoire. Par abus de langage, en C, un pointeur est une variable dont le contenu est une adresse mémoire. Cette adresse mémoire contient une donnée dun certain type alors nous parlons toujours de pointeur sur un type (ex: pointeur sur un entier, pointeur sur un double, pointeur sur un pointeur, …) En C 1.On définit un pointeur en mettant une * lors de la définition à droite du type sur lequel le pointeur pointera (ex: int* p; p est un pointeur sur un entier) 2.Un pointeur nest pas initialisé lors de sa définition. 3.On peut obtenir ladresse mémoire dune variable à laide de &. Donc, &p donne ladresse où se trouve p en mémoire. Et oui, un pointeur a une adresse mémoire. 4.On peut consulter ou modifier le contenu mémoire à ladresse contenue dans une variable-pointeur.

3 La notion de pointeur et dadresse Imaginons quune variable x est définie à ladresse mémoire Imaginons quune variable pointeur est définie et affectée à la valeur de ladresse de x. int x = 5; int* ptr_x = //obtenir ladresse de x ptr_x (1000) x On peut modifier ou consulter le contenu de x via la variable ptr_x en faisant *ptr_x &x;

4 Il nest pas possible par défaut de modifier un paramètre effectif via un paramètre formel puisque la valeur est passée par copie. La première utilisation que nous faisons des pointeurs est pour permettre la modification dun paramètre effectif par un sous-programme via son paramètre formel. Technique : Nous envoyons ladresse du paramètre effectif plutôt que son contenu. Il sera alors possible de modifier le paramètre effectif via le pointeur. Le passage de paramètre par adresse (ou référence)

5 Exemple : void echanger_valeur(int* ptr_v1, int* ptr_v2) { int tmp = *ptr_v1; *ptr_v1 = *ptr_v2; *ptr_v2 = tmp; } //exemple dappel int x = 5; int y = 7; echanger_valeur(&x, &y); //x vaudra 7 et y vaudra 5 après lexécution **Pensez à scanf

6 Pointeur sur un tableau La deuxième utilisation que nous faisons des pointeurs est pour obtenir ladresse dun tableau. Le nom de la variable dun tableau statique est un pointeur sur la première case du tableau. Cest automatique, nous navons rien de spécial à écrire sinon donner le nombre de cases avec [] lors de la définition de la variable. On sait quon peut obtenir le contenu dune case en utilisant les [] mais on peut aussi à laide de larithmétique des pointeurs où on peu ajouter ou soustraire une valeur dune adresse. Ladresse obtenue dépend du nombre doctets nécessaires selon le type pointé.

7 Pointeur sur un tableau Illustration: int tab[MAX]; // tab est le pointeur sur la première case tab On accède à une case par tab[indice] ou *(tab+indice) où indice est le nombre de cases * sizeof(int) à partir de ladresse contenue dans tab. Exemple : tab[2] est équivalent à *(tab+2) et correspond à ladresse du début de la troisième case soit tab + 2 * sizeof(int). ***Habituellement, on utilise [].

8 La notion dallocation dynamique Lallocation dynamique est la possibilité de requérir de lespace mémoire (et den obtenir ladresse) en cours dexécution du programme. Il y a trois fonctions qui permettent cela : void * malloc(size_t size); Alloue size * le nombre doctets et retourne ladresse void * calloc ( size_t num, size_t size ); Alloue num * size octets et retourne ladresse en plus dinitialiser chaque case à 0.

9 La notion dallocation dynamique void * realloc ( void * ptr, size_t size ); Alloue size octets despace mémoire et copie les size premiers octets de ptr à ladresse qui sera retournée. Il arrive que ladresse retournée soit ptr sil y avait assez de despace au bout du tableau pour lallonger. Si ptr est null, la fonction se comporte comme malloc. À lutilisation, il faut convertir le type void* en celui du pointeur qui recevra ladresse. int* tab_entier = (int*) malloc(NB * sizeof(int)); double* tab_notes = (double*) calloc(NB,sizeof(double));

10 La notion dallocation dynamique La mémoire allouée par une de ces fonctions lest à un endroit différent dune variable locale. Ce qui fait quelle reste allouée même si lallocation est réalisée dans un sous-programme. Après lexécution dune des fonctions dallocation, la mémoire alloué est disponible pour utilisation et accessible via le pointeur qui a reçu ladresse.

11 La notion dallocation dynamique Allouer un tableau à deux dimensions dynamiquement (int**). 1.Il faut allouer un tableau de la taille du nombre de lignes 2.Il faut allouer un autre tableau de la taille du nombre de colonnes pour chaque ligne (dans une boucle). int ligne; int** tab2D = (int**) malloc(NB_LIGNES * sizeof(int*)); for(ligne =0; ligne < NB_LIGNES; ligne++) tab[ligne] = (int*) malloc(NB_COLONNES * sizeof(int)); ***On peut utiliser la notation [ ][ ] par la suite.

12 La notion dallocation dynamique Un des avantages de lallocation dynamique est de pouvoir libérer lespace lorsquil nest plus utile. On libère lespace mémoire à laide de free ou de realloc avec une taille de 0*. Exemple : - free(tab) // libère la mémoire dont ladresse est //contenue dans tab) – realloc(tab,0); //Libère lespace de tab et retourne null. *La libération de la mémoire inutilisée est obligatoire dans ce cours *Prenez lhabitude de mettre le pointeur à NULL après un free ( tab = NULL)

13 Les erreurs classiques de lutilisation dadresses. Il y a plusieurs erreurs lorsquon débute avec la notion dadresse. En voici quelques-unes. 1.Confondre ladresse de la variable pointeur de ladresse contenu dans la variable pointeur. En effet, une variable pointeur a une adresse en mémoire comme toutes les variables. int* ptr = &x; //ptr == &x mais &ptr != ptr

14 Les erreurs classiques de lutilisation dadresses. Illustration: On désire utiliser scanf dans un sous-programme pour saisir une valeur dun paramètre effectif dont nous avons reçu ladresse. void saisir(int* valeur_a_saisir) { scanf (« %d », valeur_a_saisir); } *Ici, on remarque quil ny a pas de & à lappel de scanf puisque ce serait ladresse du paramètre formel et non celui du paramètre effectif.

15 Les pièges de lutilisation dadresses. 2. Ladresse dune variable locale dun sous- programme nexiste plus lorsque le sous- programme est terminé. Un piège est de retourner ladresse dune variable locale et de penser quon retourne une adresse valide. int* créer_tableau() { int tab[MAX]; return tab; } *Ladresse retournée sera celle dune mémoire non allouée dynamiquement.

16 Les pièges de lutilisation dadresses. 3. Définir un tableau 2D avec ** et ne pas allouer lespace de la deuxième dimension ( voir acétate 11 ). 4. Tenter dutiliser le passage de paramètres par référence pour allouer lespace dun tableau dans un sous-programme et le retourner via les paramètres formels. Le piège est de ne pas utiliser ladresse de la variable tableau. void alloue(int* tab[], int nb) { *tab = (int*) malloc (nb*sizeof(int)); }


Télécharger ppt "Plan cours La notion de pointeur et dadresse mémoire. Le passage de paramètres par adresse (ou référence). Pointeur sur un tableau. La notion dallocation."

Présentations similaires


Annonces Google