Wir haben uns jetzt mit Feldern und Zeigern beschäftigt und Felder,
hatten wir ja gesehen, sind letztendlich Verbunddatentypen, in denen mehrere
Daten des selben Typs hintereinander stehen, zum Beispiel mehrere Integerwerte. Zeiger sind
letztendlich ja auch ganz normale Variablen, in denen aber halt nicht normale Werte stehen,
sondern Andressen stehen. Und wenn man jetzt von Integerwerten Felder bilden kann, dann stellt sich
natürlich die Frage, warum kann man nicht eigentlich auch von Zeigern Felder bilden? Und das kann man
natürlich. Und mit diesem Thema wollen wir uns jetzt in diesem Abschnitt etwas näher beschäftigen.
Also man kann auch von Zeigern Felder bilden, ganz genauso wie man das von normalen Variablen
tun kann. Wenn ich jetzt zum Beispiel ein Feld von Integer-Zeigern anlegen möchte, dann würde ich
das eben so definieren. Integer Stern p-Feld von 5. Damit ist p-Feld ein Feld, in dem fünf Integer-
Pointer stehen. Und dann haben wir hier noch ein Integerwert i ist gleich 1. Das ist also eine ganz
normale Variable vom Typ integer, in der ein 1 steht und ein j, das ist auch eine normale Variable,
die es nicht initialisiert. In der Zugriff auf einen Zeiger des Feldes passiert jetzt ganz normal,
wie wir das mit Feldzugriffen kennen. P-Feld von 3 beispielsweise wäre natürlich hier p-Feld von 0,
1, 2, 3, wäre dieses Feldelement hier. Das heißt, ich nehme den Feldnamen, der ja auf den Anfang des
Feldes zeigt, addiere 3, also im Prinzip drei Elemente weiter, bekomme also dann den Zeiger auf
dieses Element im Sternchen. Das verbirgt sich ja hinter diesem äcklichen Klammeroperator, laufe ich
den nach und habe als Ergebnis diese Zelle hier. Diese Zelle hier ist vom Typ integer Stern und der
kann ich jetzt natürlich den Zeiger auf den Integerwert zuweisen, also zum Beispiel die Adresse
von dieser Variablen i, die ich mit und i ermittle. Und dann zeigt dieser Zeiger anschließend eben auf
die Variable i, also auf die Speicherzelle, in der diese 1 steht. Und wenn ich jetzt der Variablen j,
den Inhalt des Objekts, auf das der Zeiger aus diesem P-Feld verweist, zuweisen möchte,
dann schreibe ich eben so was hin, wie j ist gleich Stern, P-Feld von 3. Es wird also dann eben
P-Feld von 3 genommen, das ist dieser Zeiger und mit dem Sternchenoperator laufe ich ihm nach,
damit habe ich den Inhalt dieser Speicherzelle, die 1, und die weise ich dann der Variablen j zu.
Dann passiert das hier. Das ist also das, was beim Zugriff auf Felder von Zeigern und beim
Arbeiten mit den einzelnen Elementen eines solchen Feldes passiert. Es gibt eine Stelle,
wo man sowas richtig häufig braucht und das sind Felder von Zeichenketten. Zeichenketten sind ja
Characterfelder und wenn ich jetzt beispielsweise hier ein Feld von Monatsnamen anlegen möchte,
dann kann ich das folgendermaßen tun. Ich lege mir hier ein Array an, das lege ich auch static an,
weil das soll natürlich jetzt nur beim Start des Programms initialisiert werden und nicht bei jedem
Aufruf dieser Funktion und auch über mehrere Funktionsaufrufe erhalten bleiben, denn das ist
ja ein Feld, das möchte ich nicht weiter verändern. Das ist jetzt ein Feld, das heißt Monatsnamen,
das ist ein Feld von Characterpointern. Ich lasse die Felddimension hier weg, denn es wird mit
mehreren Strings initialisiert. Das heißt, es wird mit den Zeigern auf die Zeichenketten,
die jetzt hier im Anschluss aufgeführt sind, initialisiert. Was dann im Speicher bei rauskommt,
ist, dass das Monatsnamen ein Feld ist, das aus einer Reihe von Zeigern besteht und der erste
Zeiger zeigt auf das U der Zeichenkette unzulässiger Monat. Der zweite Zeiger, also Monatsnamen von 1,
zeigt auf das J von Januar, Monatsnamen von 2 auf das F von Februar und Monatsnamen 12 auf das D
von Dezember. Das wäre jetzt eine einfache Funktion. Monthname, der übergebe ich einen Wert und die
liefert mir einen Zeiger auf die entsprechende Zeichenkette, also letztendlich den String zurück,
der für diese Monatsnummer steht. Wenn ich jetzt hier eine 1 übergebe, dann wird hier für den
Fall das n kleiner 0 oder n größer 12, es wird Monatsname von 0 zu 0 gegeben und ansonsten Monatsname
von n. Wenn ich also 1 übergebe, wird Monatsname von 1 zurückgegeben. Das heißt, es wird dieser
Zeiger hier, der Zeiger auf das J von Januar, der wird zurückgegeben. Die Funktion liefert
ja einen Characterpointer zurück. Und für den Fall, dass ich kleiner 0 oder größer 12 übergeben
habe für das n, wird einfach Monatsname von 0 zurückgegeben, eben unzulässiger Monat. Und damit
haben wir eine ganz simple Funktion, die eben eine Zahl, eine Monatszahl in einen String umwandelt.
Eine andere Stelle, wo solche Characterarrays auch ganz intensiv verwendet werden, sind die
Argumente aus der Kommandozeile. Das hatten wir beim ersten Beispiel einer Mainfunktion mal ganz
Presenters
Zugänglich über
Offener Zugang
Dauer
00:19:26 Min
Aufnahmedatum
2020-05-05
Hochgeladen am
2020-05-05 18:46:37
Sprache
de-DE