struct's und pointer für dumme!!!



  • HI...
    Ehm..ich bin zwar schlau (sagen die in meiner Klasse und die lehrer)
    aber ich kapier nicht wozu ich structs brauch... oder pointer/zeiger...

    Kann mir jemand ne struct nennen die Sinnvoll ist...?? wozu brauch ich pointer (Einsatzgebiete) ich mein wenn ich ein Textarray zeichenweise ausgebe, kann ich das doch mit Index tun statt mit zeiger...
    Und wozu brauch ich dann erst structpointer oder ie die heißen?oder struct's die sich ineinander aufrufen oder was weis ich...
    Kann jemand nen link geben wo das "für dumme" erklärt wird???Oder es hier selbst posten, am besten mit quelltext und kommentiert...

    Danke im voraus



  • Der Sinn der Pointer erschliesst sich einem, wenn man anfängt, eigene Programme zu schreiben. Genauso ist es mit den Structs.

    Irgendwann will man dann nämlich mal eine Funktion schreiben, die mehr als eine Information zurückliefert. Nehmen wir an, du möchtest eine Funktion haben, die dir die Uhrzeit getrennt nach Stunden und Minuten liefert.

    Dann könnte man soetwas schreiben:

    void WieSpaet(unsigned int *Stunden, unsigned int *Minuten)
    

    oder auch

    struct ZEITSTRUCT
    {
      unsigned int Stunden;
      unsigned int Minuten;
    };
    
    void WieSpaet(struct ZEITSTRUCT *Zeit)
    


  • Ein gutes Beispiel für beides in einem wäre z.B. eine verkettete Liste oder ein Baum oder ähnliches:

    // Baum
    struct node {
        int data;
        struct node *left;
        struct node *right;
    }
    

    Grübel mal ein wenig drüber.



  • Tim, ist das sicher auch ein Baum und nicht eine Kette oder Liste?



  • Nun, genau genommen ist es nur ein Element eines möglichen Binärbaums. Sicher könnte es rein theoretisch auch eine doppelt verkettete Liste sein, aber dann wäre left/right eine ziemlich blöde Namensgebung, eher dann previous/next.



  • Aha. Ich dachte nur, ein Baum müsste immer so aussehen:

    struct node {
        int data;
        struct node *parent;
        struct node children[];
    }
    


  • GNU-Fan schrieb:

    Aha. Ich dachte nur, ein Baum müsste immer so aussehen:...

    Immer ? Iwo! Die binären Bäume haben einen linken und einen rechten Member intus.



  • zu den piontern ist noch zu ergänzen:

    wie oben schon erklärt nur mit den schlagwörtern fur die funktionen.

    Call by value......1 Rückgabewert...

    Call by reference.......mehrere Rückgabewerte...

    gz



  • Natürlich gibt es in C kein echtes call by reference. Anfänger stolpern da gerne mal drüber. Siehe auch: http://c-faq.com/ptrs/passbyref.html



  • funktions-freak schrieb:

    Call by value......1 Rückgabewert...
    Call by reference.......mehrere Rückgabewerte...

    das hat miteinander aber nicht viel zu tun.

    Tim schrieb:

    http://c-faq.com/ptrs/passbyref.html

    ...to formal pass by reference or C++ reference parameters...

    wenn man solche vergleiche zieht, ist's ja kein wunder.
    tom fährt golf, ich habe 'nen ferrari, ergo: tom hat kein richtiges auto.

    function-like preprocessor macros can provide a form of ``pass by name''

    call by name? was iss'n das?
    🙂



  • byref-freak schrieb:

    funktions-freak schrieb:

    Call by value......1 Rückgabewert...
    Call by reference.......mehrere Rückgabewerte...

    das hat miteinander aber nicht viel zu tun.

    Tim schrieb:

    http://c-faq.com/ptrs/passbyref.html

    Wie auch immer du hier deinen falschen Standpunkt rechtfertigen willst, der OP wird sich davon hoffentlich nicht beirren lassen.



  • Tim schrieb:

    Wie auch immer du hier deinen falschen Standpunkt rechtfertigen willst...

    das ist ja das problem. es gibt bei dem thema kein 100%iges falsch oder richtig.
    aber es ist 'ne frage des standpunktes, wie du schon richtig erkannt hast.
    🙂



  • Tim schrieb:

    Ein gutes Beispiel für beides in einem wäre z.B. eine verkettete Liste oder ein Baum oder ähnliches:

    // Baum
    struct node {
        int data;
        struct node *left;
        struct node *right;
    }
    

    Grübel mal ein wenig drüber.

    ??ehm..naja jetzt fängts schon an....wozu ist zum beispiel "struct node *left;" gut??ich mein....ich würde sowas erst in der main() schreiben:

    struct node {
        int data;
    
    }
    int main()
    {
        struct node *left;
        struct node *right;
    
        left=malloc(sizeof(node));
        right=malloc(sizeof(node));
    
        left->data  = 32; //als Beispiel
    
        ......
    }
    

    aber was hat es für eine Funktion, wenn es in der strukur selber drin steht???
    Oder hab ich was falsch gemacht??



  • CaPGeti schrieb:

    ??ehm..naja jetzt fängts schon an....wozu ist zum beispiel "struct node *left;" gut??

    damit werden structs miteinander verkettet. der pointer *left z.b. zeigt auf das nächsten, linken zweig einer baumstruktur und *right zeigt auf den rechten. sind die pointer z.b. 0, dann ist der zweig nicht vorhanden. über die pointer werden also beziehungen der structs untereinander hergestellt.

    struct node right = {1, 0, 0}; // datum ist 1, keine zweige
    struct node left = {2, 0, 0};  // datum ist 2, keine zweige
    struct node root = {3, &left, &right}; // datum ist 3, zweige sind 'left' und 'right'
    

    ^^ und das kann man beliebig weiterführen
    🙂



  • @CaPGeti
    Wie ich z.B. Listen gelernt habe:
    Lies eine Textdatei ein, die der User angeben kann.

    Das heißt du weist nicht wieviele Zeichen darin sind. Es können 10, 100 oder 1.000.000 sein.
    ein

    char machArr[10000000*200];
    

    geht da nich 😃 (für die freaks hier, das ist extra übertrieben)

    Also machst du es simpel und einfach so:

    struct text{
        char data[1024];
        struct text *next;
    }
    
    main()
    {
        struct text element1,
                    *aktuell;
        element1 = malloc( sizeof(struct text) );
        element1.next = NULL;
        aktuell = &element1;//das erste element darfst du nicht verlieren, also zeige mit einem Pointer drauf, und arbeite nurmit dem Pointer
    
        strcpy( aktuell->data, "dateistream1" );//daten in den charArr von element1 schreiben
        aktuell->next = malloc( sizeof(struct text) );//neues element (element2) anlegen
        aktuell = aktuell->next;//auf das neue element zeigen
        strcpy( aktuell->data, "dateistream2" );//daten in das aktuelle element lesen
    }
    

    Und jetzt kannst du diesen Text ausgeben

    aktuell = &element1;
    while(aktuell != NULL )
    {
        printf( "%s", aktuell->data );
        aktuell = aktuell->next;
    }
    

    Und zack kannst du soviel Einlesen/Ausgeben wie du willst, brauchst nur genug RAM, dafür ist z.B. ein Pointer in einer Struktur sehr gut geeignet...



  • ah cool...naja jetzt ist einen ja alle sklar, wofür das verwendet wird...
    Kann ich doch glei mal ins Spiel bringen...



  • Tolles gefühl endlich mal jemanden zu Helfen, anstatt nur um Hilfe zu fragen *g



  • lippoliv schrieb:

    (für die freaks hier, das ist extra übertrieben)

    frechheit!
    🙂



  • lippoliv schrieb:

    char machArr[10000000*200];
    

    geht da nich 😃 (für die freaks hier, das ist extra übertrieben)

    Das ist Stackquälerei !



  • Siehe kommentar 😃 😃


Log in to reply