Lektion 4 - Structs

Stell dir vor, wir programmieren ein Kontaktbuch. Ein Kontakt besteht mindestens aus einem Vornamen, einem Nachnamen und einer Telefonnummer. Wie implementieren wir das? Wir könnten einfach zwei Strings und einen Integer getrennt speichern, aber diese Lösung ist nicht optimal. Jemand, der unseren Code liest, käme nicht sofort auf die Idee, dass diese getrennten Variablen eigentlich zusammengehören. C gibt uns daher die Möglichkeit, unsere eigenen komplexen Typen mit structs zu definieren. Implementieren wir einen Kontakt:

struct contact {
  char[100] first_name;
  char[100] last_name;
  int telephone_number;
};

Das Semikolon ist erforderlich, um die Anweisung zu schließen. Jetzt können wir eine Variable vom Typ struct contact deklarieren:

struct contact new_contact;

Hierdurch wird der für einen Kontakt notwendige Platz auf dem Stack reserviert. Wir können dann mit dem Operator . auf die verschiedenen so genannten member zugreifen:

new_contact.first_name[0] = 'M';
new_contact.first_name[1] = 'a';
new_contact.first_name[2] = 'x';
new_contact.first_name[3] = '\0';

new_contact.telephone_number = 01234456789;

Structs können wie jeder andere Typ verwendet werden. Man kann beispielsweise Arrays und Pointer aus ihnen erstellen. Aus Gründen, die wir in der nächsten Übung sehen werden, ist der Umgang mit Pointer auf Structs tatsächlich eine recht häufige Begebenheit. Wie würden wir also auf ein Member eines structs zugreifen, wenn wir einen Pointer darauf haben?

struct contact* contact_pointer = &new_contact;
int number = (*contact_pointer).telephone_number;

Wir müssten den Pointer dereferenzieren und dann den . Operator verwenden. Es sieht nicht schrecklich aus, aber angesichts der Tatsache, dass dies recht häufig vorkommt, bietet uns C einen hübscheren Weg, um auf diese Felder zuzugreifen. Dieses Schnipsel ist äquivalent zu dem obigen:

struct contact* contact_pointer = &new_contact;
int number = contact_pointer->telephone_number;

Also denk dran: Verwende ., wenn du mit dem Wert eines struct arbeitest, und ->, wenn du mit einem Pointer auf ein struct arbeitest.

Praktische Übung: Du erhältst die folgenden Daten aus einem Zensus:

  1. Ein String-Array mit den Namen deutscher Städte
  2. Ein String-Array mit den Namen deutscher Bundesländer, wobei der Eintrag bei Index i mit dem Städte-Array bei Index i übereinstimmt (z.B. wenn die Stadt bei Index 2 München ist, wird das Bundesland bei Index 2 Bayern sein)
  3. Ein Integer-Array mit der Einwohnerzahl, die der Stadt bei diesem Index entspricht (z.B. wenn die Stadt bei Index 2 München ist, enthält das Integer-Array die Einwohnerzahl von München bei Index 2)

Benutze structs, um die drei Arrays zu einem zu kombinieren.

Verwende gerne diese sehr minimale Vorgabe mit einigen Eingabedaten:

vorgabe4.c