Pointer to Pointer - Verständisprobleme



  • Hallo allerseits,

    Ich habe in einer Übungsaufgabe (von einem Buch, keine Schule) eine verkettete Liste im Speicher angelegt und da Funktionen implementiert, in dem Pointer eben auf Pointer zeigen und auch in den Parameterlisten übergeben werden.

    Jetzt habe ich mir gerade die Lösung dazu angeschaut und da werden eben "Pointer zu Pointer" benutzt in einer speziellen Schreibweise mit **. Allerdings weiß ich noch nicht so richtig, wie ich das handhabe, ob es da überhaupt fundamentale Unterschiede gibt.

    Ich habe z. B. sowas da stehen:

    addToList(struct node *list, n)
    

    In der Lösung steht es so

    addToList(struct node **list, n)
    

    Gibt es in der Anwendung bei der Übergabe eines Pointers einen Unterschied ob ein oder zwei Asterisks verwendet werden? Oder ist das nur zu kenntlichmachung das man bei der Übergabe einen Pointer erwartet der dann auf einen Pointer zeigt, man ansonsten vll. erwarten würde das dort ein Pointer übergeben wird der auf einen konkreten Wert zeigt?

    Dann eine weitere Frage:

    jetzt werden Wertzuweisungen plötzlich so gemacht. Vorab:

    struct node 
    {
    	int value;
    	struct node *next;
    };
    

    die Wertzuweisung:

    struct node *new_node;
    
    new_node->next = *list;
    *list = new_node;
    

    Ich hab mir das bislang immer so gemerkt und programmiert, das bei einem Pointer wo nichts davor steht von der Adresse die Rede ist, und mit einem Asterisks der Wert der hinterlegt ist auf dem der Pointer zeigt.
    Aver wie habe ich das hier zu deuten? Heißt "
    new_node->next = *list;" nichts anderes als das der Wert des Pointers (die Adresse) zugewiesen wird? Und bei *list = new_node das gleiche?

    Irgendwie finde ich das verwirrend. Ich hab da nämlich einfach nur sowas wie new_node->next = list; stehen und das funktioniert auch.

    Entschuldigt meine vielen Fragen, aber das Thema kratzt gerade an meinen nerven da ich eigentlich dachte ich hätte das Pointer Kapitel schon komplett verstanden :o . . .

    Viele Grüße



  • Es soll ja auch der Wert des Zeigers verändert werden, der auf den Anfang der Liste zeigt. Deshalb muss ein Zeiger auf diesen Zeiger übergeben werden.
    In der letzten Zeile siehst du wie der Wert des Zeigers verändert wird, sodass er auf den neuen Anfang der Liste zeigt.

    edit: am besten immer ganze Funktion posten wie zB

    bool addToList(struct node **list, int value)
    {
    	struct node *new_node = malloc(sizeof(*new_node));
    	if(new_node == NULL)
    		return false;
    	new_node->value = value;
    	new_node->next = *list;
    	*list = new_node;
    	return true;
    }
    


  • Erstmal vielen Dank.

    Also habe ich es "richtig interpretiert" ^^ - da bin ich beruhigt.

    Danke 🙂 !


Anmelden zum Antworten