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 g(char* s) // Wertübergabe
char t = 'A';
f(t);
void f(char s) // Wertübergabe
{
s = 'Z';
}
{
*s = "Z\0";
}
char* u = "Ä\0";
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.