Wir können also in unserem Beispiel die Eltern eines Menschen nicht direkt als Menschen, sondern als Verweise auf Menschen deklarieren, was so aussieht:
struct Human { char* name; Human* mother; Human* father; };
Die Größe einer Human
-Variable lässt sich nun eindeutig bestimmen: 4 Byte werden für den Namens-Verweis benötigt und noch einmal je 4 Byte für die Verweise auf die beiden Eltern; macht 12 Byte beziehungsweise 3 Speicherzellen insgesamt. Legen wir nun also eine Variable vom Typ Human
wie folgt an
void h() { Human h; ... }
dann ergibt sich das folgende Speicherbild:
Adresse | Inhalt | Inhalt | Inhalt | Inhalt | Var | |
---|---|---|---|---|---|---|
123450 | <– esp | |||||
123454 | <– h <– h.name |
h | ||||
123458 | <– h.mother | |||||
123462 | <– h.father | |||||
123466 | <– ebp | |||||
… | … | … | … | … | ||
123490 | <– bottom |
Um nun einem Menschen einen Elternteil zuzuweisen, nutzen wir das aus dem vorletzten Artikel bekannte new
-Schlüsselwort:
void h() { Human h; h.mother = new Human; }
Hier passiert nichts anderes, dass als durch new Human
auf dem Heap der benötigte Speicherplatz für einen neuen Menschen reserviert wird und die Start-Adresse dieses reservierten Speicherbereiches an h.mother
zugewiesen wird. Der Ausdruck h.mother
verweist also im folgenden auf den gerade reservierten neuen Menschen.
Wollen wir dagegen ausdrücken, dass ein Mensch keine Eltern hat, weisen wir den Variablen einen Nullpointer zu. Dafür gibt es in C++ verschiedene Möglichkeiten; entweder nutzt man direkt die Zahl 0, oder – ab dem neuen Standard C++11 – das spezielle Schlüsselwort nullptr
(beides drückt das gleiche aus):
void h() { Human h; h.mother = 0; h.father = nullptr; }
Jetzt stellt sich natürlich die Frage, wie man mit den Eltern eines Menschen weiterarbeiten kann – experimentierfreudige werden merken, dass etwa der Ausdruck h.mother.mother
zu einer Fehlermeldung seitens des Compilers führt. Im nächsten Artikel werden wir demnach sehen, wie man mit Pointern arbeiten kann. Seid gespannt!
Kommentare (2)