|
|
||
|
|
||
| .. der Adressoperator & | ||
|
|
||
| Die Zeile .. | ||
double x; // Deklaration einer doppeltgenauen
// Fliesskommavariablen x
|
||
| .. wird Deklaration des Bezeichners (der Variablen) x genannt. Trifft der Compiler auf diese Zeile, so merkt er sich, dass x als Bezeichner einer doppelgenauen Fliesskommazahl steht, tut sonst aber nichts. Erst wenn er erstmalig auf eine Zeile trifft, in der x ein Wert zugewiesen wird, richtet er tatsächlich 8 Speicherzellen ein und trägt in diese die Fließkommadarstellung der angegebenen Zahl ein. Dieser Vorgang wird Definition und Initialisation von x genannt. | ||
x = 5.123; // Definition und Initialisation von x |
||
|
Im Maschinenprogramm das der Compiler
erstellt, existiert der Bezeichner x nicht mehr. Anstelle von x
hat der Compiler nun die Speicheradresse der ersten dieser 8
Speicherzellen im Maschinenbefehl eingetragen. x wurde also zur
Speicheradresse der ersten von 8 Speicherzellen in der die Zahl
5.123 im Fließkommaformat eingetragen ist.
Will der Programmierer diese Adresse
kennenlernen, so muss er den Adressoperator & vor den
Bezeichner der Variablen setzen. So liefert '&x' nicht den
Inhalt der 8 Speicherzellen, also nicht 5.123 sondern die
Adresse des ersten, dieser 8 Speicherbytes. Wie diese Adresse
lautet steht erst zur Laufzeit des Programms fest, und kann auch
erst dann bestimmt werden.
Beispiel: |
||
#include <conio.h>
void main (void)
{
double x = 5.123;
// Drucke den Inhalt (Wert) von x
printf ("Inhalt der Variablen: x = %f", x);
// Drucke die Adresse der Speicherzelle x
printf ("Adresse von x: &x = %Xh", &x);
}
|
||
|
Es ist in diesem Programm zu beachten,
dass der Inhalt von x eine Fliesskommazahl ist und
dementsprechend mit der Konvertierungsanweisung %f ausgegeben
werden muss. Dagegen ist die Adresse von x eine Ganzzahl, die in
ihrer hexadezimalen Form 4 Stellen umfasst. Entsprechend muß
die Adresse mit einer der Konvertierungsanweisungen für
Ganze Zahlen ausgegeben werden. Hier %X, also .. Zahl
hexadezimal mit großen Buchstaben ausgeben.
Nimmt man an, dass zur Laufzeit die Variable x ab der Adresse 2001 gespeichert wurde, dann ist der Wert von x in den Speichern 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001 enthalten und zwar von der höchsten zur niedrigsten Stelle. Die Anfangsadresse der Ablage lautet dementsprechend 2001. Die Bildschirmausgabe von obigem Programm wäre demnach .. |
||
Inhalt der Variablen: x = 5.123 Adresse von x: &x = 2001h |
|
|
|
Adr |
Inhalt von x |
|
|
|
Speicherdarstellung zur Laufzeit: |
2008 |
|
|
|
|
|
2007 |
|
|
|
|
|
2006 |
der doppeltgenaue, |
|
|
|
|
2005 |
fliesskommacodierte |
|
|
|
|
2004 |
Wert 5.123 |
|
|
|
|
2003 |
|
|
|
|
&x |
2001 |
|
|
| Nun kann man sich fragen, was ein Programmierer davon hat, wenn er weiss, wie die Adressen der Speicherbytes lauten, in denen sich eine Zahl befindet? Die Antwort ist, er kann damit die vermeintliche Beschränkung von nur einem Rückgabewert einer C-Funktion aufheben. Allerdings muss er auch noch den Indirektionsoperator * kennen, von dem im nächsten Kapitel die Rede ist. | ||
|
|
.de