Call-By-Reference
← Call-By-Value | ● | Null-Pointer →
Funktionen liefern genau einen Rückgabewert. Um mehrere Werte zurückzugeben, bedient man sich eines anderen Mechanismus: Call-by-Reference.
Dazu werden keine Parameterwerte an eine Funktion übergeben, sondern die Adressen von mehreren Speicherbereichen, an denen die Ergebnisse gespeichert werden sollen.
Will man nun mehr als einen Wert in einer Funktion zurückgeben, so übergibt man im Funktionsaufruf Referenzen auf die entsprechenden Ergebnisvariablen (container variables), in denen die Ergebnisse gespeichert werden sollen.
Die Funktion berechnet dann die Ergebniswerte, dereferenziert die entsprechenden Zeiger und weist den Speicherbereichen die zugehörigen Werte zu.
void time2hours(unsigned int time, /* input parameter: period measured in seconds */
unsigned int *hours, /* output value: period in hours */
unsigned int *minutes, /* output value: period remainder in minutes */
unsigned int *seconds) /* output value: period remainder in seconds */
{
*hours = time/3600;
*minutes = time/60%60;
*seconds = time%60;
}
unsigned int h,m,s; /* container variables */
time2hours(2000, &h, &m, &s); /* pass references */
printf("%u:%u:%uh\n", h, m, s); /* print result */
In der Standard-IO Funktion scanf wird derselbe Mechanismus verwendet, um die eingelesenen Werte zurückzuliefern.
Fallgrube: Die Referenz auf eine lokale Variable verliert ihre Gültigkeit beim Verlassen des Geltungsbereichs. Ausserhalb ist der referenzierte Wert undefiniert.
Weiteres Beispiel: Vertauschung zweier Variablen:
{
int tmp=*a;
*a=*b;
*b=tmp;
}
← Call-By-Value | ● | Null-Pointer →