/***************************************************************/ /* Prof. Dr. Carsten Vogt */ /* FH Koeln, Fak. 07 / Nachrichtentechnik */ /* http://www.nt.fh-koeln.de/vogt */ /* */ /* Beispielprogramm Nr. 44 */ /* der frueheren Vorlesung Datenverarbeitung */ /* */ /* Das Programm demonstriert die Unterschiede von Wert- und */ /* Referenzaufruf anhand einer Funktion, die die Werte in zwei */ /* aktuellen Parametern austauschen soll. */ /* Wertaufruf = call by value */ /* Referenzaufruf = call by reference */ /***************************************************************/ #include #include /* Die Funktionen austausch_xxx() sollen die Werte zweier aktueller Parameter, die ihnen das Hauptprogramm uebergibt, miteinander vertauschen. Nach Rueckkehr aus der Funktion sollen also die Variablen IM HAUPTPROGRAMM vertauschte Werte haben. */ void austausch_by_value(int a, int b) { /* Parameteruebergabe per Wertaufruf: Die Funktion arbeitet nur auf ihren lokalen Variablen a, b und hilf; die aktuellen Parameter (hier: die Variablen x und y des Hauptprogramms - siehe main()) werden nicht beeinflusst. Die Funktion erzielt also den gewuenschten Effekt NICHT. */ /* Austausch durch Dreieckstausch ueber Hilfsvariable */ int hilf; hilf = b; b = a; a = hilf; } void austausch_by_reference(int *a, int *b) { /* Parameteruebergabe per Referenzaufruf: Die Funktion greift ueber die Zeiger a und b auf die aktuellen Parameter, d.h. die Variablen des aufrufenden Programms zu (hier: die Variablen x und y des Hauptprogramms - siehe main()) und aendert sie dadurch. Das ist genau das, was ge- fordert wurde. */ int hilf; hilf = *b; /* Operator * fuehrt zur Variablen des rufenden Programms */ *b = *a; *a = hilf; } main() { int x = 1, y = 2; /* Variablen, deren Werte vertauscht werden sollen */ printf("Vor Funktionsaufruf: x = %1d, y = %1d\n\n",x,y); austausch_by_value(x,y); printf("Nach Aufruf by value: x = %1d, y = %1d\n\n",x,y); austausch_by_reference(&x,&y); printf("Nach Aufruf by reference: x = %1d, y = %1d\n\n",x,y); getch(); }