10.4 Zeiger als Funktionsparameter
Funktionen, die mit einem oder mehreren Parametern definiert werden und mit return einen Rückgabewert zurückliefern, haben wir bereits verwendet. Hierbei wurden bei jedem Aufruf alle Parameter kopiert, sodass diese Variablen der Funktion anschließend als lokale Variablen zur Verfügung stehen.
Als Alternative bietet es sich an, die Adressen der entsprechenden Variablen – statt einer Kopie – an die Funktion zu übergeben. Und wenn von Adressen die Rede ist, sind die Zeiger nicht weit entfernt.
00 // Kapitel10/func_ptr.c
01 #include <stdio.h>
02 #include <stdlib.h>
03 void reset( int *val ) {
04 *val = 0;
05 }
06 int main(void) {
07 int ival = 1234567;
08 printf("ival: %d\n", ival); // = 1234567
09 reset( &ival );
10 printf("ival: %d\n", ival); // = 0
11 return EXIT_SUCCESS;
12 }
In Zeile (09) übergeben Sie mit dem Adressoperator die Adresse der Variablen ival an die Funktion reset(). Im Funktionskopf von reset() in Zeile (03) müssen Sie natürlich als formalen Parameter einen Zeiger mit dem entsprechenden Typ definieren. Durch den Aufruf der Zeile (09) wird also dem Zeiger val in Zeile (03) die Adresse der Variable ival zugewiesen. Mithilfe des Indirektionsoperators und val können Sie jetzt auf den Wert der Variable ival zugreifen. In Zeile (04) wurde der Variable ival der Einfachheit halber indirekt der Wert 0 zugewiesen. Dies erfolgte über den Zeiger val mit dem Indirektionsoperator.
Es ist Ihnen sicherlich aufgefallen, dass bei der Funktion keine Rückgabe mit return erfolgt und der Rückgabetyp void ist. Eine Rückgabe wird hier nicht mehr benötigt, da wir den Wert direkt in die Variable des Aufrufers schreiben.