Übergabe von Pointern an Funktionen

Wert- und Referenzübergabe von Pointerobjekten

Wie wir schon gelernt haben unterscheiden bei de Übergabe von Parametern an Funktionen zwischen Wertübergabe ("call by value") und Referenzübergabe ("call by reference"). Erstere hat den Vorteil, daß übergebene Objekte nicht verändert werden können, zweitere hat erhebliche Laufzeitvorteile. Beides ließ sich wie gesehen durch const-Referenzübergaben kombinieren.

Bei Pointerparametern gelten die gleichen Regeln, wie bei allen anderen Objekten auch. Doch die angeblich so sichere Wertübergabe produziert plötzlich eine unerwartete Ausgabe:

void f(char s)       // Wertübergabe
{
  s = 'Z';
}

void g(char* s)      // Wertübergabe
{
  *s = "Z\0";
}

char  t = 'A';
char* u = "Ä\0";

f(t);
cout << "t : " << t;           //  t : A
g(u);
cout << "ü : " << u;           //  u : Z

Unglücklicherweise wird der Wert des Strings geändert. Das liegt zwar daran, daß Veränderungen des Pointers in der Funktion g() aufgrund der Wertübergabe sich nicht auf den übergebenen Pointer auswirken. Der Zugriff auf die Speicherstelle, auf die der Pointer zeigt ist dadurch aber nicht von dauerhaften Änderungen ausgeschlossen. Vielmehr bleiben diese erhalten. Dieses Problem muß immer beachtet werden, wenn eine Funktion einen Pointer als Argument erwartet.