Beruflich Dokumente
Kultur Dokumente
!
Les pointeurs taient mis dans le mme sac que l'instruction goto comme une excellente technique de formuler des programmes incomprhensibles. Ceci est certainement vrai si les pointeurs sont employs ngligemment, et on peut facilement crer des pointeurs qui pointent 'n'importe o'. Avec une certaine discipline, les pointeurs peuvent aussi tre utiliss pour programmer de faon claire et simple. C'est prcisment cet aspect que nous voulons faire ressortir dans la suite.
Cette constatation a ensuite motiv les crateurs du standard ANSI-C prescrire des rgles explicites pour la manipulation des pointeurs.
Abder Alikacem
Dpartement dinformatique et de gnie logiciel
14 5 47 8
4 16 3 87 2 26
Les pointeurs
Dfinition
Un pointeur est une variable contenant ladresse dune donne (dans le vocabulaire du langage C, le procd qui consiste atteindre une donne via un pointeur sur cette donne sappelle une indirection).
le rle d'un pointeur est de permettre l'accs une structure qui serait cre avant ou lors de l'excution. la dclaration doit spcifier le type de base de l'objet qui pourra tre accessible l'aide du pointeur.
(manipulations)
associer un pointeur un objet (de type de base) qui sera accessible l'aide de ce pointeur (ceci ne dfinit pas pour autant la valeur qui sera associe l'objet), dtruire l'objet accessible l'aide du pointeur indiquer l'absence d'objet accder, permettre un pointeur d'accder au mme objet qu'un autre pointeur, associer une valeur de type de base l'objet accessible par un pointeur, fournir la valeur de type de base associe l'objet accessible par un pointeur (diagnostiquer le cas o il n'y a pas d'objet accder), comparer deux pointeurs de mme type de base pour savoir s'ils permettent d'accder au mme objet.
Oprateurs dadressage
adresse = information que lon peut
char *ptC; float *ptT; int *ptP;
Oprateurs dadressage
Loprateur * dsigne le contenu de la variable dont ladresse est loprande. Par exemple, *ptr retourne le contenu de la variable dont ladresse est ptr.
*pointeur : rfre la variable pointe (oprateur d'indirection) Notez que dans une dclaration, loprateur * na pas le mme sens. Par exemple, la dclaration int* n; signifie que n est un pointeur sur un entier.
Oprateurs dadressage
Les oprateurs sont utilises avec des pointeurs.
Les pointeurs et le C
Exemple 1 int i1=1,i2=2; int *p1,*p2; p1=&i1; p2=p1; printf("%d\n",*p1) p2=&i2; *p2=*p1; printf("%d\n",i2)
L'oprateur &
&variable : donne l'adresse d'une variable dans un scanf partout dans un programme Si une adresse est mise dans une autre variable, cette autre variable doit tre un pointeur.
Les pointeurs et le C
Exemple 2 #include<stdio.h> int main() { int i; int * j; i = 1; j = &i; *j = 2; printf("i vaut : %dn", i); } return 0;
Les pointeurs et le C
Exemple 4 int main() { int i; int *ptrI; ptrI = &i; printf("La valeur pointe par ptrI est %d\n", *ptrI); return(0); }
Les pointeurs et le C
Exemple 3 int main() { int i; int *ptrI; ptrI = &i; printf("La valeur pointe par ptrI est %d\n", ptrI); return(0); }
Les pointeurs et le C
Exemple 5 int main() { int i; int *ptrI; ptrI = &i; i = 15; printf("La valeur pointe par ptrI est %d\n", *ptrI); return(0); }
rserve un emplacement en mmoire pour un pointeur sur un entier elle ne rserve pas en plus un emplacement pour un entier.
Mmoire principal
pointeur = adresse en mmoire
0: 4: 8: 12: 16: 1020: 1: 5: 9: 13: 17: 1021: 2: 6: 10: 14: 18: 1022: 3: 7: 11: 15: 19: 1023:
32 bits
Mmoire principal
Dclarations:
char c; float t; int p;
0: 4: 8: 12: 16: 1: 5: 9: 13: 17: 1021: 2: 6: 10: 14: 18: 1022: 3: 7: 11: 15: 19: 1023:
Oprateur dindirection
affectations: ptP = &p; *ptP = 3;
char c; float t; int p; int *ptP;
0 : 0: 4 : 4: 8: 1: 5: 9: 13: 17: 1021: 2: 6: 10:
12: 12:
31 4 : 12
18: 1022:
1020:
0 : 0: 4 : 4: 8:
2: 6: 10:
12: 12:
31 4 : 121 8 :
1022:
16: 1020:
Reprsentation graphique
affectations:
Reprsentation graphique
affectations:
ptP
ptP
p 3
Reprsentation graphique
affectations:
ptP
Reprsentation graphique
affectations:
ptPtP = &ptP;
ptPtP
ptP
p 3
12: 12:
16: 16: 20: 1020:
14:
121 8 : 16
1022:
Reprsentation graphique
affectations:
ptPtP = &ptP;
ptPtP
ptP
p 3
12: 12:
16: 16: 20: 1020:
12 16
18:
1022:
Reprsentation graphique
affectations:
Reprsentation graphique
affectations:
ptPtP
ptP
p 3 x4
ptPtP
ptP
p 4
Pointeur NULL
affectations:
ptPtP
ptP X
p 4
ptPtP X
ptP
p 4
Reprsentation graphique
affectations:
ptPtP
ptP
p 4
Affectations de pointeurs
On peut affecter un pointeur une variable pointeur de mme type. Sauf:
si on affecte l entier 0
pt1 = 0; /* dconseiller: utilisez NULL plutt */
pt3 = pt1; /* avec: void * pt3; */ pt2 = (int *) pt3; pt2 = (char *) pt3; printf("La valeur pointe par pt1 est %c\n", *(char*)pt2);
10
version 1 version 2
Li L L +i x
int elementListe(Liste l, int pos, int *err); Liste ajouterListe(Liste l, int x, int pos, int *err);
Calcul dadresses
1 tableau = une suite de cases, qui
qui sont contigus peuvent tre accdes partir dune adresse de base, par un dplacement (indice) ex: char tab[8];
11
Calcul dadresses
nom du tableau =
Calcul dadresses
int note[4]={56, 23,67,89}; int *liste; note[i] = *(note+i) = *(note+(i* "sizeof(int)" ); liste=note; liste[i] = *(liste+i) = *(liste+(i* "sizeof(int)" ); printf("%d", *++liste); printf("%d", ++*liste); printf("%d", *liste++);
note liste
b o n j o u r \0
0 1 2 3 4 5 6 7 0 1 2 3
Calcul dadresses
tab[0] = *tab = *chaine tab[i] = *(tab+i) = *(chaine+i) &tab[0] = &(*(tab+0)) = &*tab = tab i = dplacement en nb dlments tab[i] = *(tab+(i* "sizeof(char)" )
tab chane
Calcul dadresses
&tab[i] = &(*(tab+i)) = tab+i &tab[7]-tab = tab+7-tab = 7 (lments) ¬e[3]-¬e[0] = &(*(note+3))-note = 3
note
0 1 2 3
tab
1 2 3 4 5 6 7
b o n j o u r \0
0
chane
b o n j o u r \0
0 1 2 3 4 5 6 7
12
Exemple: strlen
strlenV1: utilisant un tableau strlenV2: utilisant un pointeur strlenV3: calcul dadresse appel: strlen(tab), strlen(bonjour), strlen(chaine) autres appels: strlen(&tab[3]), strlen(&chaine[4])
tab chane
Calcul dadresses
char *tab[ ] = { "Eleves","Prof","Stage"}; tab : est quivalent : &tab[0] : c'est l'adresse du premier lment du tableau. *tab : est quivalent : tab[0] : c'est le premier lment du tableau, c'est dire l'adresse du premier caractre de la chane "Eleves". tab[1] : est l'adresse sur le premier caractre de la chane "Prof".
b o n j o u r \0
0 1 2 3 4 5 6 7
Calcul dadresses
soit un tableau de chanes de caractres : char tab[10][81]; (rserve 810 octets) on pourrait dfinir un tableau de pointeurs sur des chanes : char *tab[10]; (rserve 10 var. pointeur) avantage :
Calcul dadresses
char *tab[ ] = { "Eleves","Prof","Stage"}; *tab[1] : est le caractre point par tab[1] : c'est le caractre 'P' de la chane "Prof". **tab : est quivalent : *tab[0] :c'est le caractre 'E' de la chane"Eleves". **(tab+1) : est quivalent : *tab[1] :c'est le caractre 'P' de la chane"Prof". *(tab[2]+1) : est quivalent : tab[2][1] :c'est le caractre 't' de la chane"Stages".
13
tab est l'adresse du premier octet du tableau. fonctionQc est l'adresse du premier octet implantant la fonction.
14
Exemple 1
int addition(int i, int j); int main() { int (*fonction)(int, int); /*dclaration d'un pointeur sur une fonction*/ int i=1, j=2, k; /*dclaration de 3 entiers*/ fonction = addition; k k k k } = = = = fonction(i,j); (*fonction)(i,j); addition(i,j); (*addition)(i,j);
Exemple 3
Exemple 3 : un pointeur sur une fonction comme paramtre d'une 2me fonction
void tri(int *tab, int size, Bool (*compare)(int, int)) { int idx, count; void swap(int *, int *); for (idx = 1; idx <= size - 1; idx++) for (count = 0; count <= size - 2; count++) if ((*compare)(tab[count], tab[count + 1])) swap(&tab[count], &tab[count + 1]); }
return(0);
Exemple 2
int addition(int i, int j) { return i+j; } int main() { int (*fonction)(int, int); /*dclaration d'un pointeur sur une fonction*/ int i=1, j=2, k; /*dclaration de 3 entiers*/ fonction = addition; printf("%p\n", addition); printf("%p\n", fonction); return(0); }
Exemple 4
int int int int
une calculette
int main() { int i, j ,k; int (*ptf[ ])(int , int) = {addition, soustraction, multiplication, division}; k = ptf[0](i, j); k = (*ptf[0])(i, j);
15
Exemple 4suite
char operation, tabop[]="+-*/"; int nbre1, nbre2, i;
Exemple 4..suite
printf("%d %c %d = %d\n", nbre1, operation, nbre2, (*ptf[i])(nbre1, nbre2) ); /* deuxime possibilit d'appel indirect */ printf("%d %c %d = %d\n", nbre1, operation, nbre2, ptf[i](nbre1, nbre2) ); } return 0;
Exemple 4suite
printf("Nombre 1 : "); scanf("%d", &nbre1); fflush(stdin); printf("Nombre 2 : "); scanf("%d", &nbre2); fflush(stdin); do { printf("opration (+ , -, * ou /) : "); scanf("%c", &operation); fflush(stdin); for (i = 0; i < 4; i++) if (tabop[i] = = operation) break; } while ( i = = 4 );
Type Rcursif
On dsire reprsenter un arbre gnalogique. Chaque personne est caractrise par son nom, son prnom, son pre et sa mre. Les parents d'une personne sont aussi des personnes. On aimerait donc pouvoir disposer du nouveau type personne suivant : struct pers { char nom[20]; char prenom[20]; struct pers pere; struct pers mere; }; struct pers moi;
16
Type Rcursif
Donc il faudrait rserver une place mmoire infinie. Comment s'en sortir ? Une fois de plus... grce aux pointeurs : struct pers { char nom[20]; char prenom[20]; struct pers* pere; struct pers* mere; }; struct pers moi;
selon les besoins de lapplication gestion dynamique de la mmoire mais: variables sans noms! => accs par pointeur
debut
Type Rcursif
Pourquoi cette version-l est-elle correcte ? Comme cela a dj t dit, lorsque l'on dclare une variable de type pointeur sur quelque chose, seule la place ncessaire au stockage du pointeur est rserve. Et celle-ci est fixe (4 octets en gnral). Donc, le compilateur peut rserver pour moi une place de 20+20+4+4=48 octets. Le code suivant permet alors de donner moi des parents : struct pers monPere; struct pers maMere; moi.pere = &monPere; moi.mere = &maMere;
Structures pointes
typedef struct element { TypeEl el; /* linformation stocker */ struct element *suivant; } elem; elem *debut, *courant, *nouveau; elem t1, t2, t3; debut = &t1;
debut el el
courant el
suivant t1
suivant t2
suivant t3
17
courant debut el el el
3
suivant t1 suivant t2 suivant t3
3
suivant t1 suivant t2 suivant t3
courant debut el el el
3
suivant t1 suivant t2 suivant t3
3
suivant t1
4
suivant t2 suivant t3
18
courant debut el el el
3
suivant t1
4
suivant t2 suivant t3
3
suivant t1
4
suivant t2 suivant t3
courant el
3
suivant t1 suivant t2 suivant t3
3
suivant t1
4
suivant t2 suivant t3
19
courant debut el el el
3
suivant t1
4
suivant t2 suivant t3
3
suivant t1
4
suivant t2
...
suivant t3
3
suivant t1
4
suivant t2 suivant t3
3
suivant t1
4
suivant t2
...
suivant t3
20
Allocation de mmoire
obtenir les structures au besoin:
debut debut el el el
el
3
suivant t1
4
suivant t2
...
suivant suivant t3 pile tas
Allocation de mmoire
obtenir les structures au besoin:
debut debut el el el
el
3
suivant t1
4
suivant t2
...
suivant suivant t3 pile tas
21
Allocation de mmoire
obtenir les structures au besoin:
Allocation de mmoire
obtenir les structures au besoin:
debut
el
debut
el
3
suivant pile tas
Allocation de mmoire
obtenir les structures au besoin:
Libration de mmoire
obtenir les structures au besoin:
debut
el
if (debut != NULL) {debut->el = 3; debut->suivant = NULL;} free(debut); debut = NULL; /* et non linverse */
debut
el
3
suivant pile tas
22
Libration de mmoire
obtenir les structures au besoin:
Libration de mmoire
obtenir les structures au besoin:
if (debut != NULL) {debut->el = 3; debut->suivant = NULL;} free(debut); debut = NULL; /* et non linverse */
debut
el
x
3
if (debut != NULL) {debut->el = 3; debut->suivant = NULL;} debut = NULL; free(debut); /* Ne pas faire */
debut
el
3
suivant pile tas
Libration de mmoire
obtenir les structures au besoin:
Chanage de structures
debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) {debut->el = 3; debut->suivant = NULL;} debut = (elem *)malloc(sizeof(elem));
el
if (debut != NULL) {debut->el = 3; debut->suivant = NULL;} free(debut); debut = NULL; /* et non linverse */
debut
x
3
debut
el
3
suivant pile tas
23
Chanage de structures
debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) {debut->el = 3; debut->suivant = NULL;} debut = (elem *)malloc(sizeof(elem));
debut
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el
nouveau courant el
suivant el
3
suivant pile tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
suivant tas
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
nouveau courant
nouveau courant el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
24
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL; } else ... courant = debut;
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el
nouveau courant
nouveau courant
el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
suivant el
3
suivant tas
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el
nouveau courant
nouveau courant
el
...
suivant el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
25
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
nouveau courant
el
nouveau courant
el
...
suivant el
...
suivant el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL; } else ... pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
nouveau courant
el
nouveau courant
el
...
suivant el
...
suivant el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else ... pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
26
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el suivant el
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el
...
nouveau courant suivant el
nouveau courant
...
suivant el
...
suivant el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL; } else pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el
Chanage de structures
...
suivant el
nouveau courant
...
suivant el
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el
...
nouveau courant suivant el
...
suivant el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
27
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut;
el
Chanage de structures
...
suivant el
nouveau courant
nouveau courant
...
suivant el
/* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); debut if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else pile courant->suivant = nouveau; courant = nouveau;
3
suivant tas
/* pour les autres lments */ nouveau = new(,&err); if (err != 0) exit(1); courant->suivant = nouveau; courant = nouveau;
debut
pile
tas
Chanage de structures
/* pour le premier lment */ debut = (elem *)malloc(sizeof(elem)); if (debut != NULL) { debut->el = 3; debut->suivant = NULL;} else ... courant = debut; /* pour les autres lments */ nouveau = (elem *)malloc(sizeof(elem)); if (nouveau != NULL) { nouveau->el = ...; nouveau->suivant = NULL;} else courant->suivant = nouveau; courant = nouveau;
Chanage de structures
/* pour le premier lment */ debut = new(3,&err); if (err != 0) exit(1); courant = debut;
nouveau courant
fonction new
/* pour les autres lments */ nouveau = new(,&err); if (err != 0) exit(1); courant->suivant = nouveau; courant = nouveau;
debut el
3
suivant pile tas
28
Chanage de structures
/* pour le premier lment */ debut = new(3,&err); if (err != 0) exit(1); courant = debut;
Chanage de structures
/* pour le premier lment */ debut = new(3,&err); if (err != 0) exit(1); courant = debut;
nouveau courant
nouveau courant
el
...
suivant el
/* pour les autres lments */ nouveau = new(,&err); if (err != 0) exit(1); courant->suivant = nouveau; courant = nouveau;
debut
el
3
suivant pile tas
/* pour les autres lments */ nouveau = new(,&err); if (err != 0) exit(1); courant->suivant = nouveau; courant = nouveau;
debut
3
suivant pile tas
Chanage de structures
/* pour le premier lment */ debut = new(3,&err); if (err != 0) exit(1); courant = debut;
Chanage de structures
/* pour le premier lment */ debut = new(3,&err); if (err != 0) exit(1); courant = debut;
nouveau courant
el
nouveau courant
el
...
suivant el
...
suivant el
/* pour les autres lments */ nouveau = new(,&err); if (err != 0) exit(1); courant->suivant = nouveau; courant = nouveau;
debut
3
suivant pile tas
/* pour les autres lments */ nouveau = new(,&err); if (err != 0) exit(1); courant->suivant = nouveau; courant = nouveau;
debut
3
suivant pile tas
29
Chanage de structures
/* pour le premier lment */ debut = new(3,&err); if (err != 0) exit(1); courant = debut;
nouveau courant
el
...
suivant el
/* pour les autres lments */ nouveau = new(,&err); if (err != 0) exit(1); courant->suivant = nouveau; courant = nouveau;
debut
3
suivant pile tas
Chanage de structures
Remarques
30