// refs.cc Beispiel fuer Funktion mit Referenzuebergabe
// swap_ soll die Werte zweier Variablen vertauschen
using namespace std;
#include <iostream>
// FALSCHE Variante:
void swap0(int x, int y)  {   // lokale Kopien der Werte
  int tmp = x;
  x = y; y = tmp;             // diese lokal (!) vertauscht
}                             // bleibt ausserhalb ohne Effekt
// Zeiger-Variante, in C ueblich, in C++ moeglich
void swap1(int* x, int* y) {  // lokale Kopien von Zeigern auf Variable
  int tmp = *x;               // die Inhalte der Variablen, auf die
  *x = *y;   *y = tmp;        // die Zeiger weisen, werden vertauscht.
}
// Referenzen-Variante, gleiche Semantik wie swap1, in C++ moeglich
void swap2(int& x, int& y) {  // "Referenzen" = Adressen werden uebergeben
  int tmp = x;                // Wert einer Referenz ist der Inhalt der
  x = y; y = tmp;             // Speicherstelle, auf die die Referenz zeigt.
} // code- und aufrufgleich mit swap0, abgesehen von der Deklaration von x,y
int main() {
  int a, b;
  cout << "Eingabe a b ";  cin  >> a >> b;
  cout << "a = " << a << ", b = " << b << '\n';
  swap0(a,b);                                    // Werte uebergeben
  cout << "a = " << a << ", b = " << b << '\n';
  swap1(&a,&b);                                  // Adressen uebergeben
  cout << "a = " << a << ", b = " << b << '\n';
  swap2(a,b);                                    // Referenzen uebergeben
  cout << "a = " << a << ", b = " << b << '\n';
}
/* Ein-/Ausgabe:
Eingabe a b 3 5
a = 3, b = 5
a = 3, b = 5                    swap0 hat nicht vertauscht
a = 5, b = 3                    swap1 hat vertauscht
a = 3, b = 5                    swap2 hat vertauscht         */
