2017-04-04 7 views
0

Je lisais le tcp/ip illustré v2 et confondu avec une série de codes sur le livre.Impossible de faire face à un pointeur inutile semble pointeur lorsque je lisais le code de base de BSD 4.4

struct ifnet{ 
    struct ifnet * if_next; 
    …… 
} 

est ici les informations de base de la structure qui peut vous aider à en apprendre davantage sur le problème

void if_attach(struct ifnet* ifp){ 
    struct ifnet **p = &ifnet; 
    while(*p): 
     p = &((*p)->if_next); 
    *p = ifp; 

pourquoi l'auteur a utilisé un pointeur vers pointeur dans cet endroit? Je promets que dans le texte restant, les p n'apparaissent plus jamais (ce qui signifie qu'il n'est jamais utilisé comme argument d'aucune fonction).

À mon avis, ce code peut être converti en ce

struct ifnet *p = ifnet; 
while(p): 
    p = *p->if_next; 
p = ifp; 

Est-ce exact?

+0

La variable 'p' est une variable locale. Si vous l'avez seulement comme 'struct ifnet * p' alors vous modifiez seulement cette variable locale, et ces changements seront perdus une fois la fonction terminée. En utilisant un pointeur sur un pointeur, changer '* p' modifie définitivement ce que' p' pointe vers. Dans ce cas, ajouter un noeud à une liste chaînée. –

+0

thanku tant de bro – WaldenShen

Répondre

0

L'auteur a utilisé un pointeur sur un pointeur, car il a remarqué un point commun qu'il a exploité dans une abstraction. C'est "traverser la liste par les liens" au lieu de par les nœuds.

Vous savez évidemment que si votre structure de données de liste chaînée est référencée par un pointeur, alors vous devez passer un pointeur vers ce pointeur dans votre fonction, au cas où l'insertion ou la suppression se produirait sur le nœud principal. Sinon, vous modifiez les pointeurs internes des nœuds en question. Mais que se passe-t-il si vous faites référence à ces pointeurs de nœud interne par leur adresse, au lieu de les accéder via le nœud dans lequel ils se trouvent? Eh bien, le code devient le même pour le nœud principal et tous les nœuds internes.