** bei Funktionsübergabe



  • Hi

    Kann mir jemand erklären was das bedeutet wenn ich zwei Sterne also ** bei einer Funktionsübergabe hab ?

    void Node(T_STRUCT **Root, T_STRUCT *Node);
    

    Danke 🙂



  • T_STRUCT EineStrutur;
    T_STRUCT *EinPointeraufeineStruktur;
    T_STRUCT **EinPointeraufeinenPointer_deraufeineStrukturzeigt;

    Achso:
    Verwendet wird das z.B. dann, wenn die Funktion einen Pointer auf eine Sruktur zurückliefern soll.



  • Und für was braucht man jeztt genau einen Pointer auf einen Pointer der auf eine Struktur zeigt ?



  • Hmm, am besten mal ein konkretes Beispiel.
    Mal nicht mit einer Struktur sondern mit einem char-string

    #include <stdio.h>
    
    void machtext(char** p_szText)
    {
      //Ich reserviere mal 40 Bytes und sag dir auch gleich wo
      *p_szText = malloc(40);
      strcpy(*p_szText, "Das hab ich gemacht!");
    }
    
    int main() 
    { 
      char *Textpointer1, *Textpointer2;	//Nur Pointer OHNE Speicher
    
      machtext(&Textpointer1);
      printf("%s\n", Textpointer1);
    
      machtext(&Textpointer2); //Nochmal, aber anderen Speicher  
    
      //Main kann jetzt eigenverantwortlich den Speicher wieder freigeben
      free(Textpointer1);
      free(Textpointer2);	
    
      return 0;
    }
    

    Die Funktion machtext erstellt hier den Speicher und so können die Pointer auch in main verwendet werden.
    main ist dann auch für die Speicherfreigabe verantwortlich.
    Mit einer Struktur ist es quasi genauso.
    Der Aufrufer will also die Adresse einer Struktur wissen.
    Die Struktur wird erstellt oder existiert bereits irgendwo, das ist aber Sache der konkreten Funktion.



  • Ok, vielen Dank, das kapier ich jetzt, aber eine Frage is grad noch aufgetaucht.
    Was bedeutet dann so was ?

    NewNode(&((*Root)->pLeft), Node);

    Ich mein den Teil: &((*Root)->pLeft)

    Root wird in die Funktion reingegeben mit T_STRUCT **Root;
    Die Funktion NewNode ist rekursiv.



  • Hallo

    CrazyOwl schrieb:

    Ich mein den Teil: &((*Root)->pLeft)

    (*Root) dereferenziert Root, also den kommt T_STRUCT* raus. ->pLeft liest eben die "linke" Variable aus der Struct raus. Das & vor der Klammer ermittelt die Adresse von pLeft, welches vom Typ T_STRUCT* ist. Das Resultat ist wieder ein T_STRUCT**, aber auf das "linke" Element. Wenn die Funktion rekursiv ist, wird wohl eine Scheife durchlaufen...



  • Klingt alles logisch *g* Nur gesehen hab ich so was vorher zum ersten Mal. Vielen Dank euch beiden. 🙂


Log in to reply