FLSI602 Génie Informatique et Réseaux Alberto Bosio alberto.bosio@lirmm.fr www.lirmm.fr/~bosio/FLSI602
Les pointeurs Définition d’un pointeur Allocation statique Un pointeur est une variable contenant des adresses d’emplacements mémoires On dit d’un pointeur bien initialisé, qu’il pointe sur un emplacement mémoire int *pI1, *pI2; double *pD; Allocation statique Avant toute chose, un pointeur doit être initialisé int X; int *P; P = &X; /* P contient l’adresse de la variable X */ *P = 6; /* Est équivalent à X = 6 */
Allocation dynamique de mémoire La fonction « malloc » permet de réserver un emplacement mémoire Si possible, la fonction malloc retourne l’adresse de l’emplacement réservé Si la mémoire est saturée, la fonction malloc retourne la valeur NULL La fonction « sizeof » retourne la taille de l’espace mémoire occupé par une variable de type donné La fonction « free » permet de libérer un espace mémoire réservé
Exemple #include <stdlib.h> /* On place dans P l’adresse d’un emplacement mémoire pouvant contenir un entier */ int *P; /* déclaration */ P = (int*) malloc (sizeof(int)); /* allocation */ if (P == NULL) printf ( “Memory Allocation Error \n”); else { /* On place l’entier 5 dans l’emplacement pointé par P */ *P = 5; /* On libère l’emplacement pointé par P grâce à la fonction */ free (P); }
Manipulations de base int *P, *Q; /* Déclaration de deux pointeurs */ int X; /* Déclaration d’une variable standard */
Manipulations de base P = &X; /* Allocation statique */ *P = 6;/* Affectation indirecte de X */ printf (“%d” ,X); /* Affiche 6 */
Manipulations de base printf (“%d” ,*P); /* Affiche 7 */ P = (int*) malloc (sizeof (int)); /* Allocation dynamique */ *P = 7; /* Initialisation de l’emplacement pointé par P */ printf (“%d” ,*P); /* Affiche 7 */
Manipulations de base Q = P; /* Copie du contenu d’un pointeur */
Manipulations de base Q = (int*) malloc (sizeof (int)); /* Allocation dynamique */ *Q = *P + 1; /* Initialisation de l’emplacement pointé par Q */ P = NULL; /* Emplacement pointé par P perdu */ free (Q); /* Libération correcte */ Q = NULL; /* Affectation non automatique */
Problème de gestion mémoire int *P, *Q; /* Déclaration de deux pointeurs */ P = (int*) malloc (sizeof (int)); /* Allocation dynamique */ *P = 1; Q = P; /* Copie de pointeur */ *Q = *Q + 2; /* Modification de l’emplacement pointé par P et Q */
Problème de gestion mémoire free (P); /* Libération de l’emplacement*/ P = NULL; /* pointé par P -> et Q DANGER - DANGER - DANGER Q pointe sur un emplacement non réservé*/
Allocation dynamique de tableaux const int N = 4; /* Déclaration statique */ int T[N],i; for(i=0; i<N; i++) T[i] = 2*i;
Allocation dynamique de tableaux const int N = 4; /* Déclaration statique */ int T[N],i; for(i=0; i<N; i++) T[i] = 2*i; La taille du tableaux doit être constant
Allocation dynamique de tableaux int N; int T[N],i; void main (void) { printf ( "Insert the size : ”); scanf (”%d”,&N); for(i=0; i<N; i++) T[i] = 2*i; }
Allocation dynamique de tableaux int N; int T[N],i; void main (void) { printf ( "Insert the size : ”); scanf (”%d”,&N); for(i=0; i<N; i++) T[i] = 2*i; }
Allocation dynamique de tableaux int N; int *pT; printf ( "Insert the size : ”); scanf (”%d”,&N); pT = (int*) malloc (sizeof (int)*N);
Allocation dynamique de tableaux int N; int *pT; printf ( "Insert the size : ”); scanf (”%d”,&N); pT = (int*) malloc (sizeof (int)*N); Dans ce cas N = 3
Allocation dynamique de tableaux for(i=0; i<N; i++) /* Utilisation du tableau */ pT[i] = T[i] + 1;
Allocation dynamique de tableaux free (pT); /* Libération du tableau */ pT = NULL;
Modes de transmission des arguments Par adresses void echanger(int* pa, int* pb) { int tmp = *pa; *pa = *pb; *pb = tmp; }
Modes de transmission des arguments Transmission de tableaux Toujours par adresses, le nom d’un tableau représentant : son adresse mémoire l’adresse de son premier élément void initialiser(int *pT, int n) { for(int i = 0; i < n; i++) pT[i] = i; } void main() { int x[3]; initialiser(x, 3); /* pT = x = &x[0] */