Zeiger Verständnis
-
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 Bezeichnungstruct_ptr
(als Pointer) des Typsadres
erzeugt. Richtig?
-
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 Funktionausgabe
übergeben. Dann.... dann ward abgebrochen.
struct_ptr
ist ein Pointer auf einstruct 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.