Programmieren
 
 
 
 
 
C-Grundkurs
 
 
 
 
 
.. 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.
 
 
 
 
www..de