Dereferenz-Operator *

Mittels des Dereferenz-Operators kann auf einen Wert zugegriffen werden, welcher als Pointer vorliegt. Der Stern * steht dabei links des Ausdruckes, der eine Adresse darstellt und zu welchem der Wert angesprochen werden soll.






a: 100
#include <stdio.h>

int main(){
  int a = 100;
  int* aptr = &a;
  printf("a: %d\n", *aptr);
  return 0;
}

Details

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

Der Dereferenz-Operator ist das direkte Gegenstück zum Adress-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 Dereferenz-Operator wird auch Indirektions-Operator genannt, beide Begriffe sind etwas verwirrend. Mit Dereferenz ist gemeint, dass ein Pointer nicht einen eigentlichen Wert speichert, sondern nur einen Index (eine Referenz) auf einen lvalue representiert, welcher durch den Dereferenz-Operator dereferenziert, also angesprochen wird. Der Begriff ist verwirrend, da schlussendlich eine Referenz & auf den gesuchten Wert zurückgegeben wird. Mit Indirektion ist gemeint, dass der Pointer nicht der eigentliche Wert, sondern nur eine Umleitung (eine Indirektion) an den Speicherort darstellt. Mittels des Indirektions-Operators kann dieser Wert indirekt angesprochen werden. Auf dieser Seite wird der Name Dereferenz verwendet.

Der Dereferenz-Operator kann für beliebige Ausdrücke verwendet werden, welche zu einem Pointer auswerten. Dieser Operator funktioniert somit insbesondere für Pointer auf Variablen, aber auch beispielsweise für Pointer auf Elemente von Arrays. Sehr nützlich ist dieser Operator, wenn ein Array sequentiell abgearbeitet werden soll:










0,1,2,3,4
#include <stdio.h>

int main(){
  int i;
  int a[5];
  int* aptr = a;
  for(i=0; i<5; ++i){
    *aptr++ = i;
  }
  printf("%d,%d,%d,%d,%d\n", a[0], a[1], a[2], a[3], a[4]);
  return 0;
}

Es sei hierbei angemerkt, dass aufgrund der Operatorenrangordnung Klammern nicht nötig sind.