Frage zu struct - Strukturvariablen und Zeiger auf diese
-
Hallo,
wann und warum sollte man mehrere Strukturvariablen erstellen, die zu der selben Struktur gehören?
Ich habe ein Beispiel erstellt und komme dort mit einer einzigen Strukturvariable m aus:#include <stdio.h> #include <string.h> struct mensch { int alter; char name[20]; }; int main() { struct mensch m; m.alter = 10; strcpy(m.name, "John"); printf("Alter: %d\n", m.alter); printf("Name: %s\n", m.name); m.alter = 20; strcpy(m.name, "James"); printf("Alter: %d\n", m.alter); printf("Name: %s\n", m.name); return 0; }
Wann sollte ich eine weitere Strukturvariable z.B. m2 erstellen? Das habe ich leider noch nicht verstanden.
Und wofür/wann benötige ich einen Zeiger auf meine Strukturvariable?
Z.B:struct mensch *mp; mp = &m;
Wenn ich richtig verstehe, kann ich auch ohne Zeiger mittels Punktoperator auf jede Komponente meiner Struktur jederzeit zugreifen.
Könnte mir jemand das bitte an einem einfachen Beispiel (vielleicht meinem) erklären?
Vielen Dank im Voraus!
-
In deinem Fall kannst du nur einen Menschen beschreiben.
Wenn du einen anderen beschreiben willst, gehen die Informationen über den Alten verloren.Also ist es ganz praktisch wenn man Informationen für mehr Menschen speichern kann.
Meist weiss man aber nicht für wie viele Menschen das sein soll.
Wenn du eine Anzahl festlegst, hast du entweder zu wenig resrviert oder Speicher verschwendet.Darum holt man sich den Speicher bei Bedarf. Und da kommen dann die Zeiger ins Spiel.
Zeiger brauchst du auch, wenn du nicht die ganze Struktur an eine Funktion übergeben willst.
-
Hi und danke für deine Antwort.
Also wenn ich einfach mehrere Strukturvariablen erstelle z.B. m1 bis m10, dann wird für jede Strukturvariable im Arbeitsspeicher Platz von der Größe meiner Struktur reserviert? Also wenn meine Struktur z.B. 20 Byte im RAM benötigt, dann wird damit 10x20Byte Platz reserviert, auch wenn ich nicht alle Strukturvariablen verwende?
Die zweite Antwort habe ich leider noch nicht verstanden, deshalb habe ich ein Beispiel gebaut. Bitte mein Beispiel korrigieren/verbessern, wenn ich auf eine Struktur falsch zugreife oder sie falsch als Parameter verwende. Ich habe verschiedene Möglichkeiten im Internet gesehen und weiß leider nicht wie man es am besten macht.
Hier mein Beispiel:
#include <stdio.h> #include <string.h> struct mensch { int alter; char name[10]; } m; void neue_daten(struct mensch *mp, int alter, char name[10]) { mp->alter = alter; strcpy(mp->name, name); } void daten_anzeigen(struct mensch *mp) { printf("Alter: %d\n", mp->alter); printf("Name: %s\n", mp->name); } int main() { struct mensch m; neue_daten(&m, 12, "Sandy"); daten_anzeigen(&m); return 0; }
Hier benötige ich wieder eine Strukturvariable und überschreibe die Daten.
Ohne Zeiger würde das aber auch funktionieren:void neue_daten(int alter, char name[10]) { m.alter = alter; strcpy(m.name, name); }
Darum holt man sich den Speicher bei Bedarf. Und da kommen dann die Zeiger ins Spiel.
Mit malloc? Dann muss ich mir die alten Adressen merken, bevor ich meinem Zeiger eine neue zuweise. So sind dann die einfach verketteten Listen entstanden? Könnte ich nicht die Adressen in eine Variable speichern und dann mit dem &-Operator arbeiten, oder warum sind Zeiger notwendig?
Zeiger brauchst du auch, wenn du nicht die ganze Struktur an eine Funktion übergeben willst.
Wie funktioniert das?
Vielen Dank!
-
Dein erstes Beispiel ist richtig. Du arbeitest da ja auch schon mit Zeigern, womit du auch schon deine letzte Frage beantwortet hast.
Bei deinem zweiten Beispiel fehlt der Funktion die Information über m.
Wo kommen die her?Du kannst dies zwar lokal anlegen und auch zurückgeben lassen, aber da werden die Daten nochmal hin- und herkopiert.
struct mensch neue_daten2(int alter, char name[10]) { struct mensch m; m.alter = alter; strcpy(m.name, name); return m; } int main() { struct mensch m; m = neue_daten2(12, "Sandy"); daten_anzeigen(&m); return 0; }
Das Problem bleibt aber, wo du die Daten letztendlich ablegst.
Klar kannst du auch m1 bis m10 machen und dann mit & arbeiten.
Aber wie weit willst du da gehen ?
m11 oder m20 oder m100, reicht nicht oder ist zu viel.
Zudem ist es ein haufen Schreibarbeit.In deinem ersten Beispiel kannst du auch
int main() { struct mensch *m; m = malloc(sizeof(*m)); // Hier fehlt noch die Fehlerbehandlung neue_daten(m, 12, "Sandy"); daten_anzeigen(m); free(m); return 0; }
Das mit malloc ist nicht besonders schwer.
Deinen Funktion neue_daten und daten_anzeigen ist es egal wo der Speicher her kommt.Die Sache mit dem Speicherplatz geht auch noch so weit, dass man auch den Platz für den Namen (Anschrift ...) mit malloc anfordert
-
...
-
Hallo und danke!
Ich habe leider kein vernünftiges Buch auf Deutsch gefunden. Ich habe mir mehrere Bücher auf Amazon angeschaut, aber diese Bücher haben laut Rezensionen gravierende Fehler. Und ich möchte eine Programmiersprache nicht falsch lernen. Z.B.: "C von A bis Z" von Galileo oder "C - Einführung und professionelle Anwendung" und andere.
Es gibt aber mittlerweile sehr viele Online-Tutorials zu C, die ich benutze.
Falls aber jemand ein sehr gutes Buch auf Deutsch mir empfehlen kann, wo ich die ganzen Themen sehr ausführlich und verständlich finde, dann wäre ich dafür sehr dankbar.Ich arbeite aber an meinem Englisch, so dass ich irgendwann auch die Literatur auf Englisch lesen kann. (in einem vernünftigen Tempo)
-
forumnewbie schrieb:
Falls aber jemand ein sehr gutes Buch auf Deutsch mir empfehlen kann, wo ich die ganzen Themen sehr ausführlich und verständlich finde, dann wäre ich dafür sehr dankbar.
http://ecx.images-amazon.com/images/I/31CGVMSIUgL._SL500_AA300_.jpg
-
gigg schrieb:
... eine Empfehlung für dem K&R
Damit kann man zwar gut C lernen, aber dafür sollte man schon programmieren können.
forumnewbie braucht ein (,zwei oder drei) Buch über Programmieren, C und Programmiertechniken
Darum wäre ein Buch über Algorithmen und Datenstrukturen auch interressant.