Gut, also ist ein Zeiger lediglich ein Array, welcher auf die erste Stelle zeigt.
Doch dann bleibt Frage wozu gibt es Zeiger?
Tut mir wirklich leid, wenn ich so blöde frage, doch ich versteh es wirklich nicht ganz.
Ich habe gerade Zeit und Geduld
. Ein Beispiel wozu du Zeiger brauchst, ist das dynamische alloziieren von Speicher.
Angenommen du schreibst ein Programm, welches Zahlen einliest. Wieviele Zahlen das Programm einliest ist nicht gegeben. Hier kannst du nicht einfach sagen ich alloziiere mal int[X] vor weil du entweder mehr Zahlen einlesen könntest als du alloziiert hast, oder du viel zu viele Zahlen allozierst die du gar nicht brauchst -> Memoryverschwendung.
Ein Beispiel wie sich das lösen lässt, wäre mit einer einfach verketteten Liste. Eine solche wird beispielsweise in einem Struct oder mittels einer Klasse implementiert (hier als struct):
Code:
struct zahlenreihe {
zahlenreihe *next;
int zahl;
}
Wie du siehst, referenziert ein Pointer *next auf denselben Datentyp. Der Sinn davon ist, dass du bei einem Element anfängst einzulesen und - wenn du ein weiteres brauchst - mittels dem *next Pointer ein weiteres Element alloziierst (ein Pointer selbst alloziiert ja keinen Datentyp, er verweist nur darauf). Wenn du nochmals ein Element brauchst, hast du ja wieder einen *next Pointer den du zum alloziieren verwenden kannst. Wenn du beim letzten Element bist und *next nicht mehr brauchst, setzt du diesen auf NULL. Wenn du nun die Liste durchsuchen möchtest, fängst du beim ersten Element an und gehst die Liste durch, bis *next == NULL ist.
Pseudocode:
Code:
int zahl = 0;
zahlenreihe meineZahlen;
zahlenreihe *aktuellesElement = &meineZahlen;
solange(wahr) {
cout << "Bitte Zahl eingeben, bei -1 wird abgebrochen" << endl;
zahl = zahlEinlesen();
if(zahl == -1) break;
aktuellesElement->zahl = zahl;
aktuellesElement->next = new zahlenReihe;
aktuellesElement = aktuellesElement->next;
aktuellesElement->next = NULL;
}
cout << "Die eingegebenen Zahlen sind:" << endl;
aktuellesElement = &meineZahlen;
solange(wahr) {
cout << aktuellesElement->zahl << endl;
if(aktuellesElement->next != NULL) { aktuellesElement = aktuellesElement->next; } else { break }
}
Bin mir gerade nicht sicher wegen den * und &, aber ich denke ist korrekt so. Lasse mich gerne korrigieren
.
Anmerkungen:
- es muss mind. 1 Eintrag gemacht werden, ich habs KIS mässig implementiert um zu erklären
- ja, wenn man C++ programmiert sollte man nur noch Klassen bzw. Objekte verwenden und keine Structs, ich weiss