
Envoyé par
yassine316
pour quoi on passe un pointeure de pointeur en paramatre dans la fonction addNode , je pence que on aurait pu lui passer que un pointeure
Bonjour
Une fonction qui reçoit un élément en paramètre ne reçoit
qu'une copie de ce qu'on lui envoie. N'oublie jamais ce point et tu t'en sortiras en C.
Exemple
1 2 3 4 5 6 7 8 9 10
| int main() {
int x=500;
fct(x); // Ici la fonction ne reçoit qu'une copie de "x" (même si cette copie est stockée dans une variable portant le même nom)
// Ici "x" est resté inchangé
printf("x=%d\n", x);
}
void fct(int x) {
x=123; // Ici affectation de "123" dans la variable locale "x" (qui ne contient qu'une copie de ce qu'on a envoyé à la fonction). Quel que soit ce qu'on lui envoie, ça reste inchangé
} |
Si on veut qu'une fonction modifie une variable, alors il faut lui passer l'adresse de cette variable. La fonction stockera une copie de cette adresse mais les adresses étant communes à tout le code, même avec une copie de l'adresse on peut quand-même aller à cette adresse et modifier ce qui s'y trouve.
Et une adresse est stockée dans un pointeur (pointeur du type de la variable d'origine)
Exemple
1 2 3 4 5 6 7 8 9 10
| int main() {
int x=500;
fct(&x); // Ici la fonction reçoit une copie de l'adresse de "x". Mais même une copie de l'adresse reste l'adresse réelle de "x".
// Ici "x" a été modifié
printf("x=%d\n", x);
}
void fct(int *pt) {
*pt=123; // Ici affectation de "123" à l'adresse copiée dans "pt". Si cette adresse est l'adresse d'une variable réelle, alors cette variable est modifiée
} |
Donc la règle est la suivante: une fonction qui doit modifier une variable de type
truc reçoit l'adresse de cette variable et stocke cette adresse dans un
truc étoile.
Si maintenant le type "truc" est déjà un pointeur (de type donc
xxx étoile), la règle ne change pas. On lui passe l'adresse de cette variable. Et cette adresse sera alors stockée dans un
xxx étoile étoile.
Exemple avec "tree" de type "node étoile"...
1 2 3 4 5 6 7 8 9 10 11
| int main() {
node* tree=NULL;
fct(&tree); // Ici, comme avant, la fonction reçoit une copie de l'adresse de "tree". Mais "tree" étant un "node étoile", cette adresse sera stockée dans un "node étoile étoile"
// Ici "tree" a été modifié
printf("tree=%p\n", tree);
}
void fct(node* *pt /* Qu'on écrit plutôt "node **pt") */ {
*pt=malloc(sizeof(node)); // Ici le retour de "malloc" est stocké à l'adresse placée dans "pt" (donc à l'adresse référencée par la variable "node"
} |
0 |
0 |