Referenzen

In C kann man Speicher entweder als vereinbarte Variable oder über einen Zeiger ansprechen. In C++ kommt noch eine dritte Möglichkeit dazu, nämlich eine Referenz. Das ist ein neuer Name oder Ausdruck für eine Speicherstelle, also für eine vorhandene Variable oder eine Stelle in allokierten Speicher.

Eine Referenz auf einen Speicher kennzeichnet man mit einem vorangestellten &.

Beispiel:

// Time-stamp: "(13.11.01 20:55) ref0.cpp [Klaus Wachtler (aw38)]"
//
// Einfaches Beispiel fuer eine Referenz.

int main()
{
  int     a;     // eine Variable
  int    &b = a; // keine neue Variable, sondern nur ein
                 // neuer Name fuer a.

  a = 10;        // a erhaelt den Wert 10
  b = 12;        // a erhaelt den Wert 12
}
Eine Referenzvariable muß mit dem Speicherobjekt initialisiert werden, die sie ansprechen soll. Eine spätere Änderung ist dann nicht mehr möglich. Dabei ist es prinzipiell egal, ob das Speicherobjekt eine lokale oder eine globale Variable ist, oder frei allokiert wurde (malloc() etc. im C-Stil, oder new im C++-Stil).

Eine angenehme Anwendung von Referenzen ist das Umgehen von lästigen Zeigeroperationen. Beispielsweise würde in C eine Funktion, die zwei Variablen vertauscht, etwa so aussehen:

// Time-stamp: "(13.11.01 20:56) refpar.c [Klaus Wachtler (aw38)]"
 *
 * C-Variante der Referenzparameter.
 */

#include <stdio.h>

 void tausche( int *a, int *b )
{
  int tmp = *a;

  *a = *b;
  *b = tmp;
}

int main()
{
  int
    v1 = 10,
    v2 = 5;

  printf( "%d %d\n", v1, v2 );
  tausche( &v1, &v2 );
  printf( "%d %d\n", v1, v2 );

  return 0;
}

Mit Referenzen kann man dieses Beispiel in C++ etwas eleganter ausdrücken:

// Time-stamp: "31.10.04 09:46 refpar.cpp klaus@wachtler.de"
//
// Beispiel fuer Referenzparameter.

#include <iostream>

void tausche( int &a, int &b )
{
  int tmp = a;

  a = b;
  b = tmp;
}

int main()
{
  int
    v1 = 10,
    v2 = 5;

  std::cout << v1 << " " << v2 << std::endl;
  tausche( v1, v2 );
  std::cout << v1 << " " << v2 << std::endl;

  return 0;
}

Hier sind weder in der Funktion tausche() explizite Zeigeroperationen nötig, noch müssen beim Aufruf die Adressen von v1 resp. v2 übergeben werden. Trotzdem werden in tausche() a und b als Referenzen, also neue Namen von v1 und v2 behandelt. Vertauscht werden also nicht lokale Parameter a und b, sondern tatsächlich v1 und v2!

Da eine Referenz eine Speicherstelle bezeichnet, darf man ihr auch etwas zuweisen. Ein Ausdruck vom Typ ,,Referenz auf ...`` darf also auf der linken Seite einer Zuweisung stehen (ein sogenannter lvalue), mit ++ oder -- manipuliert werden, usw.. Beispiel:

// Time-stamp: "(15.11.01 16:10) reffun.cpp [Klaus Wachtler (aw38)]"
//
// Beispiel fuer Referenzparameter.

#include <iostream>

using namespace std;

// feldzugriff() liefert eine Referenz auf das feld[index].
int &feldzugriff( int feld[], int index )
{
  return feld[index];
}

int main()
{
  int
    i,
    array[5] = { 0 };

  array[2] = 25;                // array[2] = 25
  feldzugriff( array, 3 ) = 35; // array[3] = 35
  feldzugriff( array, 4 )++;    // array[4]++

  for( i=0; i<5; i++ )
    {
      cout << array[i] << endl;
    }

  return 0;
}

Dieses Programm gibt aus:

0
0
25
35
1



Unterabschnitte
AnyWare@Wachtler.de