004
15.01.2004, 16:55 Uhr
virtual
Sexiest Bit alive (Operator)
|
Probieren wirs mal kurz: Alles, was in einem Programm so kreucht und fleucht, also Variablen und Funktionen, liegen irgendwo im Speicher. Eine Variable zB liegt also an einem bestimmten Ort im Speicher. WEnn man sich den Speicher als eine gaaaanz lange aneinanderreigung von lauter Bytes vorstellt, dann kann man sie durchnummerieren, von 0 bis sonstwo (soviel Speicher Dein rechner eben hat). Diese Nummer nennt man "Speicheradresse". Ein Zeiger ist etwas, was eine Speicheradresse aufnehmen kann.
Wenn ich in C eine Variable deklariere, dann sieht das so aus:
Damit dage ich x sei ein Speicherbereich, in dem ich den Wert 4711 reintue. Jedesmal wenn ich x erwähnt, geht das Programm dann intern hin und liest/schreibt diesen Speicherbereich. Nun kann es manchmal sinnvoll sein, zu wissen, wo denn dieser Speicherbereich zu finden ist, also was seine Adresse ist. Dann definiert man einen Zeiger:
C++: |
int x = 4711; int* zeiger_auf_x = &x;
|
Nun zur Anwendung: In C wird generell Call-By-Value gemacht, dh wenn ich eine Funktion aufrufe, dann werden von den parametern kopien angefertigt:
C++: |
void f(int x) { x++; }
int main() { int y = 1; f(y); // y ist weiterhin 1 }
|
In obigen Beispiel wird y an f übergeben. Allerdings wird nur eine Kopie übergeben, wodurch y auch nach dem Funktionsaufruf 1 ist (und nicht 2, wenn wir Call by Reference hätten). Nun kann man aber manchmal eben daran interessiert sein, einen CallByReference zu machen und genau das wird mit Zeigern gemacht: man sagt f, wo es den Wert findet und f ist dann in der Lage über die Adresse auf den Speicher zuzugreifen:
C++: |
void f(int* x) { (*x)++; }
int main() { int y = 1; int* zeiger_auf_y = &y f(zeiger_auf_y); // y ist nun 2 }
|
Leider ist die Notation etwas umständlicher als zuvor: aber nun wird an f eine Adresse übergeben. f geht hin und "dereferenziert" die Adresse und erhöht das, wohin gezeigt wird um 1. Daher bleibt die Änderung auch in main sichtbar. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 15.01.2004 um 17:01 Uhr von virtual editiert. |