Zeiger Verständnis



  • Warum sollte ich überrascht sein? Vielleicht, weil anstelle von Buchstaben die Häufigkeit von Zahlen ausgegeben wird? Das liegt an dem %d, welches anstelle von dem %c genutzt wird. Übrigens danke für die Mühe, mir das zu verdeutlichen. 😉



  • Als ich den Thread gestern Abend entdeckt habe, dachte ich da sei noch Erklärungsbedarf.
    Wenn ich mir den Thread heute allerdings bei Lichte betrachte, hattest Du's ja schon geschnallt gehabt, bevor ich überhaupt in die Diskussion eingestiegen bin...ein wenig überflüssig also...

    Naja...war mir ein Vergnügen! 🙂



  • Nochmal eine Frage bezüglich der Zeiger:

    /* struct3.c */
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 30
    
    struct adres {
       char vname[MAX];
       char nname[MAX];
       long PLZ;
       char ort[MAX];
       int geburtsjahr;
    } adressen;
    
    /* Funktion zur Ausgabe des Satzes */
    void ausgabe(struct adres *struct_ptr) {
       printf("\n\nSie gaben ein:\n\n");
       printf("Vorname.........:%s",(*struct_ptr).vname);
       printf("Nachname........:%s",(*struct_ptr).nname);
       printf("Postleitzahl....:%ld\n",(*struct_ptr).PLZ);
       printf("Ort.............:%s",(*struct_ptr).ort);
       printf("Geburtsjahr.....:%d\n",(*struct_ptr).geburtsjahr);
    }
    
    int main(void) {
       printf("Vorname      : ");
       fgets(adressen.vname, MAX, stdin);
       printf("Nachname     : ");
       fgets(adressen.nname, MAX, stdin);
       printf("Postleitzahl : ");
       do {
          scanf("%5ld",&adressen.PLZ);
       } while(getchar()!= '\n');
       printf("Wohnort      : ");
       fgets(adressen.ort, MAX, stdin);
       printf("Geburtsjahr  : ");
       do {
          scanf("%4d",&adressen.geburtsjahr);
       } while(getchar()!='\n' );
    
       ausgabe(&adressen);
       return EXIT_SUCCESS;
    }
    

    Speziell hierum geht es:

    void ausgabe(struct adres *struct_ptr) {
       printf("\n\nSie gaben ein:\n\n");
       printf("Vorname.........:%s",(*struct_ptr).vname);
       printf("Nachname........:%s",(*struct_ptr).nname);
       printf("Postleitzahl....:%ld\n",(*struct_ptr).PLZ);
       printf("Ort.............:%s",(*struct_ptr).ort);
       printf("Geburtsjahr.....:%d\n",(*struct_ptr).geburtsjahr);
    }
    

    Dabei gehts es mir um den Inhalt zwischen den Klammern nach void ausgabe . Hier wird eine Struktur mit der Bezeichnung struct_ptr (als Pointer) des Typs adres erzeugt. Richtig?


  • Mod

    Wo hast du ständig diese Schrottbeispiele her? Schreibst du die selber? Wohl kaum, sonst würdest du sie ja verstehen. Also wohl aus irgendeinem Internettutorial. Bestätigt alle Vorurteile gegen Internettutorials. Egal, wo auch immer du das her hast: Finger weg!



  • CrispyTurtleAlligator schrieb:

    Hier wird zuerst das struct adres in die Funktion ausgabe übergeben. Dann

    .... dann ward abgebrochen. 🙂

    struct_ptr ist ein Pointer auf ein struct adres . Kein Objekt, sondern ein Pointer. Um auf die Elemente (vname, nname, PLZ, usw ...) zugreifen zu können, muss der Pointer erst dereferenziert werden - sprich, das Objekt, auf den der Pointer zeigt, muss geladen werden. Das passiert in den (*struct_ptr) -Blöcken.

    Übrigens schreibt man das so nicht. Gebräuchlicher ist diese Syntax:

    printf("\n\nSie gaben ein:\n\n");
       printf("Vorname.........:%s",struct_ptr->vname);
       printf("Nachname........:%s",struct_ptr->nname);
       printf("Postleitzahl....:%ld\n",struct_ptr->PLZ);
       printf("Ort.............:%s",struct_ptr->ort);
       printf("Geburtsjahr.....:%d\n",struct_ptr->geburtsjahr);
    

    Der ->-Operator macht das gleiche - Dereferenzierung und dann Zugriff auf das spezifizierte Element. Auch so eine Sache, die die Lesbarkeit um über 9000 Prozent steigert - vor allem dann, wenn du richtig komplizierten Code schreiben musst irgendwann, wo du über etliche Objekte auf Schlüsseljagd bist, immer auf der Suche nach dem nächsten Wert.

    SeppJ schrieb:

    Wo hast du ständig diese Schrottbeispiele her?

    Kann auch sein, dass er die von seinem Prof hat. Und dass die gerne mal an der Praxis vorbei lehren, sollte hier eigentlich bekannt sein. 😉



  • SeppJ schrieb:

    Wo hast du ständig diese Schrottbeispiele her? Schreibst du die selber? Wohl kaum, sonst würdest du sie ja verstehen. Also wohl aus irgendeinem Internettutorial. Bestätigt alle Vorurteile gegen Internettutorials. Egal, wo auch immer du das her hast: Finger weg!

    C von A bis Z von Galileo Computing. Viele Sachen sind dort mangelhaft erklärt und auch falsch, deshalb auch die häufigen Fragen. Sobald das neue Monat kommt, steht ein neues Buch an, damit ich euch damit nicht mehr Quäle. 😉

    Ist denn meine Erklärung wenigstens richtig?



  • CrispyTurtleAlligator schrieb:

    C von A bis Z von Galileo Computing.

    Nuff said. Wirf es weg. JETZT!

    Nein, keine Debatte. JETZT!



  • dachschaden schrieb:

    CrispyTurtleAlligator schrieb:

    C von A bis Z von Galileo Computing.

    Nuff said. Wirf es weg. JETZT!

    Nein, keine Debatte. JETZT!

    🙄 😃

    Ay ay, Captain! 😉



  • Wennde mir nicht glauben willst: Klick!



  • dachschaden schrieb:

    Wennde mir nicht glauben willst: Klick!

    Doch doch, ich glaub das schon. 😉 Ich hab das ja öfters schon gelesen. Alles, was ich in dem Buch lese, hinterfrage ich auch zig mal um mir möglichst nichts falsches anzueignen. Aber danke für die Warnung. 😉 Womit hast du persönlich gelernt?



  • Mit einem C++-Buch. Irgendein Markt+Technik Dingens, was billiges aus der Stadtbibliothek. Würde ich heute nicht mehr mit der Kneifzange anfassen, vor allem deswegen, weil auf neue Features von C++ nie Rücksicht genommen wurde.

    Später bin ich dann von Windows auf Linux gewechselt, und habe erst mal gestaunt, wie schnell C im Vergleich kompiliert. Zuerst war C++ immer noch einfacher für mich, weil mir die ganzen C-Fallstricke nicht bekannt waren - während ich heute nicht mal mehr darüber nachdenke.

    Wenn du wirklich C lernen willst: installiere Linux und lies dir während des Programmierens die man-pages durch, aber übernehme keinen direkten Code aus ihnen. So habe ich nach C++ und Perl einigermaßen erfolgreich C gelernt.
    Der Grund, warum du nicht direkt Code aus den man-pages übernehmen solltest, ist weil dieser meist aus antiken Zeiten stammt, schlecht formatiert ist und noch weniger gut kommentiert. Halte dich stur an die Text-Passagen, und schau dir den Code nur dann an, wenn du wirklich absolut nix verstehst.



  • dachschaden schrieb:

    Mit einem C++-Buch.

    Das wollte ich auch. Meine Hochschule ab Oktober jedoch lehrt nur C und Java. Ich weiß ja nicht, wie groß die Umstellung von C++ zu C dann ist, wenn einige Sachen unter C nicht mehr funktionieren bei Prüfungen..

    Ich nehme deinen Rat mal an und schaue mich gleichzeitig mal nach einem neuen Buch um.


Anmelden zum Antworten