Referenzen

EscTheCtrl

Grünschnabel
Code:
int main ()
{
  int *ptr = {nullptr};
  int val = 123 , val2 = 234;
  ptr = &val;
  int &ref1 = *ptr;
  int &ref2 = val2;

  cout << ref1 << endl; // hier Ausgabe 123
  cout << ref2 << endl; // hier Ausgabe 234

  *ptr = 456;
   ptr = &val2;
  *ptr = 678;

  cout << ref1 << endl; // hier Ausgabe 456
  cout << ref2 << endl; // hier Ausgabe 678

  return 0;

Nun meine Frage. Warum wird bei der 2. Ausgabe von ref1 der Wert 456 ausgegeben und nicht 678? den ref1 ist ja eine Referenz auf ptr und dessen Wert wird ja letztendlich mit *ptr = 678 dereferenziert... . Hab da wohl was falsch verstanden =).

LG
 
Hallo EscTheCtrl

ptr zeigt zuerst auf val, hat also dessen Adresse. ref1 ist eine referenz auf das worauf ptr zeigt (da du dereferenzierst), also val. Anschliessend lässt du ptr auf val2 zeigen, änderst du dann den Wert auf den ptr zeigt änderst du also val2.

Normalerweise macht der Compiler dann aus deinem Code folgendes:
C++:
int* ptr = nullptr;
int val = 123, val2 = 234;
ptr = &val;
int* ref1 = ptr;
int* ref2 = &val2;

std::cout << *ref1 << std::endl;
std::cout << *ref2 << std::endl;

*ptr = 456;
ptr = &val2;
*ptr = 678;

std::cout << *ref1 << std::endl;
std::cout << *ref2 << std::endl;

Referenzen werden also in der Regel im Compilierschritt in Pointer umgewandelt (wobei das natürlich nicht so geregelt oder verlang ist, kann also jeder Compiler so machen wie er will). Aber für die Vorstellung finde ich hilft es manchmal wenn man sich folgendes merkt:
T& ref = value -> T* ref = &value;
ref = otherValue -> *ref = otherValue;
ref = otherRef -> *ref = *otherRef

Viele Grüsse
Cromon
 
Zurück