C verwendet sogennantes Call-by-Value. Das heißt wenn eine Funktion aufgerufen wird, dann wird ihr der Wert des Argumentes übergeben, nicht dessen Ort im Speicher. Das wird realisiert indem der Wert an eine neue Stelle im Speicher kopiert wird.
Die Funktion
bool hatElement(struct Liste haystack, int needle);
soll prüfen ob die Liste haystack
die Zahl needle
enthält. Angenommen haystack
ist mehrere Gigabyte groß. Dann wird viel Zeit auf das Kopieren von Daten verwendet.
Dieses Kopieren kann vermieden werden indem anstatt der Liste ein Zeiger auf die Liste übergeben wird:
bool hatElement(struct Liste* haystack, int needle);
Zeiger können also dazu verwendet werden Kopieren großer Datenmengen zu vermeiden.
Die Funktion
int holeElement(struct Liste* haystack, int position);
soll aus der Liste haystack
das Element an der Position position
liefern. Es könnte aber sein, dass an dieser Position überhaupt kein Element vorhanden ist. Um das mitzuteilen, kann man einen zusätzlichen Parameter verwenden:
int holeElement(struct Liste* haystack, int position, int* fehlercode);
Die Funktion kann jetzt in *fehlercode
speichern, ob an der postion
ein Element gefunden wurde. Der Paramter muss ein Zeigertyp sein, weil der Wert ansonsten nach Beendigung des Funktionsaufrufs verloren geht.
Zeiger können also dazu verwendet werden mehrere Rückgabewerte zu liefern.
Vorteil in einem kurzen Satz
Man kann mit Zeigern Call-by-Reference simulieren.