Betrachte diesen Post als sinnfrei, wenn dich das nicht interessiert, aber das ist oft die nächste Frage, die ich bekomme:
Wenn man eine Variable einer Funktion übergibt, ist das innerhalb der Funktion nicht unbedingt die Selbe! Kleine Veranschaulichung:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream>
void foo(int something) {
std::cout << "Adresse: " << &something << " Wert: " << something << std::endl;
}
int main() {
int i = 5;
std::cout << "Adresse: " << &i << " Wert: " << i << std::endl;
foo(i);
return 0;
}
|
Ausgabe würde so aussehen:
|
C-/C++-Quelltext
|
1
2
|
Adresse: 0xff8c8d7c Wert: 5
Adresse: 0xff8c8d40 Wert: 5
|
Die Adressen sind unterschiedlich - hier handelt es sich intern also um zwei Variablen, und nicht um eine. Das liegt daran, dass hier innerhalb der Funktion foo() eine Kopie der übergebenen Variable angelegt wird, die nach dem Beenden der Funktion wieder zerstört wird. Die Variable, die ich in der main()-Funktion übergebe, wird dabei nicht berührt(außer beim Anfänglichen Kopieren).
Bei den globalen Variablen wäre das wie zu erwarten nicht so:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream>
int i = 5;
void foo() {
std::cout << "Adresse: " << &i<< " Wert: " << i<< std::endl;
}
int main() {
std::cout << "Adresse: " << &i << " Wert: " << i << std::endl;
foo();
return 0;
}
|
Ergibt die Ausgabe
|
C-/C++-Quelltext
|
1
2
|
Adresse: 0x8050768 Wert: 5
Adresse: 0x8050768 Wert: 5
|
Die Variable ist hier tatsächlich zweimal die selbe.
Das Verhalten kann man mit der ersten Methode allerdings auch erreichen. Dazu übergibt man den Parameter als Referenz. Das macht man, indem man innerhalb der Parameterliste den Adress-Operator benutzt(&). Hier wird dann keine Kopie mehr erstellt, sondern ein Alias für die übergebene Variable angelegt. Würde ich innerhalb dieser Funktion also "something" ändern, würde ich damit auch rückwirkend die Variable aus der main()-Funktion[hier heißt sie "i"] ändern - es ist ja die selbe.
|
C-/C++-Quelltext
|
1
2
3
|
void foo(int &something) { // Hier wurde die Referenz eingefügt
std::cout << "Adresse: " << &something << " Wert: " << something << std::endl;
}
|
Damit würde man beispielsweise folgende Ausgabe erhalten:
|
C-/C++-Quelltext
|
1
2
|
Adresse: 0xff99ffe8 Wert: 5
Adresse: 0xff99ffe8 Wert: 5
|
Weiterführende Stichworte zu dem Thema sind:
Scopes,
Pass By Value und
Pass By Reference