changer le pointeur passé par valeur

J’ai donné une fonction foo(struct node *n)n est le noeud principal dans une liste chaînée. Maintenant, foo devrait changer, il pointe à la fin de la liste.

Mais est-ce possible avec cette signature de fonction?

En supposant que t soit le pointeur sur la fin de la liste:

  • n = t ne fonctionnera pas car le pointeur est passé par valeur.
  • *n = *t ne fonctionnera pas car j’écraserais l’en-tête de la liste.

Ai-je manqué quelque chose?

    Vous devez utiliser un pointeur sur un pointeur:

     foo(struct node **n) 

    Pour changer les points n , vous faites:

     *n = t; 

    Non, car vous avez une copie de la valeur du pointeur qui a été transmis. Vous n’avez pas access au pointeur d’origine qui a été transmis. Pour modifier le pointeur en dehors de la fonction, la signature doit être foo (struct node ** n).

    Tu n’as rien manqué. Ce n’est pas possible avec la déclaration de fonction donnée.

    Comme vous l’avez écrit, le pointeur est passé par valeur. Par conséquent, s’il est modifié, il ne se propage pas à la variable d’origine.

    Vous devez changer le prototype en foo(struct node **n); ou struct node *foo(struct node *n); et retourne le nouveau pointeur comme résultat.

    Non, vous ne pouvez changer aucun argument passé par valeur.

    Vous ne pouvez pas changer n et demander à l’appelant de voir le changement. Vous pouvez changer n->prev->next et n->next->prev cependant – c’est peut-être ce dont vous avez besoin.

    Il est impossible que le changement soit reflété dans la fonction appelante. Cependant, à l’intérieur de foo , vous pouvez changer n au contenu de votre coeur.

     int foo(struct node *n) { n = NULL; /* ok */ }