2014-07-26 16 views
6

Ich habe Zweifel über diesen Code, den ich an der Universität sah.C++ Zeiger Zweifel

struct nodeList{ 
    int data; 
    nodeList * next; 
}; 
typedef nodeList * List; 

void filter(List &l) 
{ 
    List * aux = &l; 
    while(*aux) 
    { 
     if((*aux)->data > 3) 
     { 
      List toDelete = *aux; 
      *aux = (*aux)->next; 
      delete toDelete; 
     } 
     else 
     { 
      aux = &((*aux)->next); 
     } 
    } 
} 
  • Ich weiß nicht, was List * aux = &l; tut tatsächlich tun. Weil List ist das gleiche wie nodeList * so wäre der Code nodeList * * aux = &l; und das ist eigentlich, was ich nicht verstehe, ist das ein Zeiger auf einen Zeiger, der die Adresse eines Zeigers von nodeList struct enthält?

  • Die zweite Sache, die ich habe Schwierigkeiten zu verstehen, ist die letzte Zeile. aux = &((*aux)->next); Warum ist aux ohne * auf der linken Seite? Wenn es als List *aux = &l; deklariert wurde ist List nur ein Zeiger auf den ersten Knoten?

Vielen Dank im Voraus. Ich habe viel gegoogelt, aber ich habe keine Antworten gefunden. Wenn Sie meine Fragen beantworten können, werde ich mich sehr freuen.

+0

Vielleicht die Zeile: 'typedef nodeList * List;' sollte als 'typedef nodeList List geschrieben werden;' Und dann scheinen viele Dinge verständlich zu sein. – askmish

+1

nein, die Zeile ist mit dem * Ich tippte das und es funktioniert. loswerden der Werte höher als 3 – HoNgOuRu

Antwort

5
  1. Genau.

  2. Sie sollten die Datentypen immer übereinstimmen. aux ist ein nodeList **, daher sollte jede Zuweisung vom selben Datentyp sein. Da ((*aux)->next)nodeList * ist, verwenden Sie den Operator &, um eine nodeList ** zu erhalten.

Datentypen

Variablen haben spezifische Datentypen. Zum Beispiel ist aux ein List*, aber List ist ein Alias ​​von nodeList*, also aux ist ein nodeList**.

Aber auch Ausdrücke haben Datentypen als Ganzes. Zum Beispiel

  • der Ausdruck ((*aux)->next) ist vom Datentyp nodeList * und &((*aux)->next) ist vom Datentyp nodeList **. Sie verwenden den Operator &, um die Speicheradresse einer Variablen abzurufen. Der Ergebnisdatentyp & ist ein weiterer Stern.
  • Der Ausdruck *aux hat den Datentyp nodeList *, da aux nodeList ** ist und der Sternoperator den Wert des spitzen Elements durch den Zeiger erhält, wodurch effektiv ein Stern vom Datentyp entfernt wird.
+1

Ich verstehe nicht Entschuldigung ... (aux ist "nodelist *") und "* aux" ist "nodelist **" oder nicht? – HoNgOuRu

+0

@HoNgOuRu aktualisierte Antwort – vz0

1
  • Ich weiß nicht, was List * aux = &l; tut tatsächlich tun. Weil List ist das gleiche wie nodeList * so wäre der Code nodeList * * aux = &l; und das ist eigentlich, was ich nicht verstehe, ist das ein Zeiger auf einen Zeiger, der die Adresse eines Zeigers von nodeList struct enthält?

Es nimmt die Adresse des Zeigers äquivalent von dem Referenzparameter (somit ist das gleiche wie ein nodeList** tatsächlich).

  • Die zweite Sache, die ich nicht verstehen müssen, ist die letzte Zeile. aux = &((*aux)->next); Warum ist aux ohne * auf der linken Seite? Wenn es als List *aux = &l; deklariert wurde ist List nur ein Zeiger auf den ersten Knoten?

aux ist eine Referenz, so dass der ursprüngliche Zeiger als Parameter übergeben l wird geändert.

+0

danke für Ihre Antwort auch. – HoNgOuRu

2
void filter(List &l) 

Das bedeutet, „als Verweis übergeben“ und nicht als „durch den Wert“, das heißt ein Zeiger auf das Objekt passieren l anstatt Kopie l auf den Stapel. In Bezug darauf, wie es tatsächlich auf einem Computer funktioniert, gibt es keinen Unterschied zwischen "void filter (List & l)" und "void filter (List * l)", da beide Zeiger sind, die an eine Funktion übergeben werden. Aus Sicht des Coders hat jedoch der "Filter void (Liste & l)" den Vorteil, dass der Compiler sicherstellt, dass Sie kein "nullptr" erhalten.

List * aux = &l; 

Dies bedeutet "gib mir einen Zeiger auf Objekt l". Das Symbol "&" wird für viele verschiedene Dinge in C/C++ verwendet, und in diesem Zusammenhang bedeutet es "gib mir die Adresse von". aux ist ein Zeiger auf ein Objekt vom Typ List, kein Objekt vom Typ List (natürlich ist List hier selbst ein Zeiger auf nodeList).

aux = &((*aux)->next); 

*aux wird die Aufgabe durch aux hingewiesen, die eine "nodeList *" ist. (*aux)->next ist der nächste Zeiger in dem nodelist-Objekt, auf das das List-Objekt zeigt, auf das von aux verwiesen wird. aux = & legt den Aux-Zeiger so fest, dass er auf dieses Objekt zeigt.

Dieses Code-Segment ist nicht besonders klar oder prägnant, so nehme ich an, es ist auf diese Weise als ein pädagogisches Tool geschrieben, um zu sehen, wenn Sie Zeiger, Referenzen und Adresse von in C/C++ verstehen. Daher sollten Sie die Definitionen dieser Operatoren möglicherweise in einem Lernprogramm zu Zeigern in C/C++ überprüfen.

+0

Vielen Dank für Ihre Antwort. Ich verstand die letzte Zeile besser, nachdem ich festgestellt habe, dass die erste Zeile geschrieben werden könnte als List * aux; aux = & l; Ich habe nicht berücksichtigt, dass, wenn Sie List * aux = & l; Sie tun diese beiden Zeilen. danke nochmal. – HoNgOuRu