Ich kann es mal versuchen.
Wenn du irgendwelche Daten im Speicher anlegst, dann liegen die da. Klingt komisch, ist aber so.
![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
Ein Zeiger ist nichts anderes als ein Zahlenwert, der zeigt,
wo im Speicher deine Daten liegen.
Als theoretisches Beispiel nehmen wir mal einen Datensatz aus einer Kundendatei. Da drin sind Anrede, Name, Vorname, Straße, PLZ, Wohnort, Telefonnummer, Email und noch ein paar andere Sachen gespeichert. Insgesamt ist der Datensatz ca. 500 Byte (Zeichen und Zahlen) lang. Und genau soviel Platz belegt der Datensatz im Speicher. Logisch.
Mit einem einzelnen Datensatz ist das auch gar nicht tragisch. Was aber, wenn du jetzt aus der gesamten Kundendatei mit 5000 Kunden genau einen gaaanz speziellen Datensatz finden willst? Insgesamt belegen jetzt die zu durchsuchenden Daten 5000 * 500 = 2.500.000 Bytes. Das ist schon etwas mehr. Sogar deutlich mehr. (Bevor du meinst, daß 2,5 Mio Bytes heutzutage kein Problem darstellen - in der Grafikprogrammierung bist du ruckzuck im Gigabyte-Bereich, wenn du nicht aufpasst).
Hmmm...
Du könntest z.B. einfach die ganzen 2,5 Mio Bytes durchgrasen und schauen, wo sich der gewünschte Datensatz befindet.
Aber!
Dein Programm weiß, daß jeder Datensatz 500 Byte groß ist. Jetzt kannst du z.B. einen
Zeiger auf einen Datensatz erzeugen. Dieser ist nur ein paar popelige Byte groß. Denn er enthält lediglich die Speicheradresse, an der sich der Datensatz befindet.
Du kannst also sagen: Zeiger = 1;
Damit zeigt der Zeiger auf das 1. Byte im Speicher. Und dann liest du einfach die Bytes ab dieser Adresse ein, bis zu entscheiden kannst, ob das der gesuchte Datensatz ist, oder nicht. Sobald du weisst, daß er es nicht ist, kannst du sagen: Zeiger += 500 (wenn er noch auf der 1 stand). Und schon zeigt der Zeiger auf den nächsten Datensatz und du musst wieder nur den Namen oder Ort oder wonach auch immer du suchst einlesen und vergleichen.
Statt also alle 2,5 Mio Bytes Zeichen für Zeichen durchzuackern, kannst du mittels eines Zeigers gezielt von Datensatz zu Datensatz springen.
Jetzt sind Zeiger noch so gebastelt, daß sie "wissen", wieviel Bytes an Daten sich an der Stelle befinden müssen, wo sie hinzeigen.
Beispiele:
char* wwi = 1;
Damit wird an der Speicherstelle 1 ein einziges Zeichen, nämlich ein char gelesen.
int* wwi2 = 12;
Damit werden (bei den meisten Systemen) an der Speicherstelle 12, 13, 14 und 15 insgesamt 4 Bytes gelesen, die dann den Zahlenwert des Integers darstellen.
Kundendatensatz* Zeiger = 501;
Hiermit werden von 501-1001 die Daten eines Kundendatensatzes (wie oben beschrieben) eingelesen.
Ein Zeiger ist eine Speicheradresse, die auf einen Speicherbereich zeigt, an dem sich die Daten eines bestimmten Datentyps befinden sollen.
Eine Referenz hängt eng damit zu sammen.
Wenn du ein Unterprogramm aufrufst und ihm dabei Parameter übergibst, dann hast du zwei Möglichkeiten dies zu tun:
1. Es wird im Speicher eine Kopie des zu übergebenden Werts erzeugt und damit innerhalb der Funktion gearbeitet. Dadurch kann der originale Wert nicht versehentlich verändert werden, allerdings kann das Kopieren des Wertes einen enormen Speicher- und Zeitaufwand bedeuten.
2. Du übergibt einen Zeiger auf den Wert. Dann kann die Funktion tatsächlich die Originaldaten des Parameters verändern, aber das enorme Kopieren der Daten entfällt.
Auch dazu ein Beispiel. Du hast ein Bild Bitmap, 500MB groß.
Und du hast eine Unterfunktion Grayscale, welche dir das Bild in Graustufen umwandeln soll. Betrachten wir uns die beiden genannten Möglichkeiten:
1. Bitmap wird temporär im Speicher kopiert. Das bedeutet, daß 500MB an Daten herumgeschaufelt werden. Diese Kopie wird dann an Grayscale übergeben. Sobald Grayscale mit der Arbeit fertig ist, müssen die veränderten 500MB über die originalen 500MB drüber geschrieben werden und die veränderten 500MB müssen danach wieder aus dem Speicher entfernt werden. Ein ungeheurer Aufwand.
2. Du übergibst Grayscale einen
Zeiger, der genau auf die Stelle zeigt, an der das 500MB Bitmap beginnt. Es werden ein paar popelige Byte an Grayscale übergeben und verwaltet, was schneller geschieht, als du schauen kannst. Die Veränderungen werden direkt am Bild im Speicher vorgenommen. Es sind auch keine Aufräumarbeiten notwendig.
Aber! Wenn Grayscale irgendeinen Fehler macht, dann hast du deine Originaldaten verloren, was bei Methode 1 nicht zwingend der Fall sein muß.
Methode 2 nennt man Parameterübergabe als
Referenz.
Verbesserungen und Korrekturen dieses Grobabrisses sind von Leuten mit mehr Ahnung explizit erwünscht. ;-)