Adress-Operator &

Mittels des Adress-Operators kann auf die Speicheradresse einer Variablen oder eines Elementes zugegriffen werden. Das AND-Zeichen & steht dabei links des Ausdruckes, zu welchem die Adresse ausgewertet werden soll.






Address of a: bffff89c
Address of b: bffff898
#include <stdio.h>

int main(){
  int a = 5;
  int b = 5;
  printf("Address of a: %x\n", (unsigned int)&a);
  printf("Address of b: %x\n", (unsigned int)&b);
  return 0;
}

Details

Der Adress-Operator erwartet einen Operanden als lvalue und wird von rechts nach links abgearbeitet. Der Rückgabewert ist ein rvalue und hat als Typ einen Pointer auf den Typ des Operanden.

Der Adress-Operator ist das direkte Gegenstück zum Dereferenz-Operator. Während der Adress-Operator zu einem lvalue den Pointer zurückgibt, wandelt der Dereferenz-Operator ebendiesen Pointer wieder zurück in einen lvalue.

Der Adress-Operator kann für beliebige Ausdrücke verwendet werden, welche zu einem lvalue auswerten, der sich im Speicher befindet. Dieser Operator funktioniert somit insbesondere für Variablen, aber auch für Elemente von struct-, class- oder Array-Typen.











Address: bffff89c
Address: bffff88c
#include <stdio.h>

struct BMI{
  float weight;
  float height;
};

int main(){
  struct BMI a = {65, 1.75};
  int b[5] = {1, 2, 3, 4, 5};
  printf("Address: %x\n", (unsigned int) &(a.height));
  printf("Address: %x\n", (unsigned int) &(b[2]));
  return 0;
}

Es ist hierbei zu beachten, dass die Klammern aufgrund der Operatorenrangordnung nicht nötig wäre, der Lesbarkeit halber jedoch werden sie hier geschrieben (nach Gutdünken des Autors).

Dieser Operator wird häufig verwendet, wenn eine Funktion ein Pointer-Argument erwartet, das gewünschte Argument beim Funktionsaufruf jedoch nur als Referenz vorliegt. Gerade in den Standardbibliotheken gibt es einige Funktionen, welche einen Pointer auf eine Variable erwarten, insbesondere um den dadurch adressierten Wert auch in der aufrufenden Funktion zu verändern. Weitere Informationen darüber können bei den Argumenten und Parametern nachgelesen werden.

Wenn bei einer Register-Variablen versucht wird, mittels des Adress-Operators & die Adresse anzusprechen, meldet der Compiler den Fehler address of register variable ... requested.