Handbuch zur dynamischen Ablaufverfolgung in Solaris

Zeigerarithmetik

Da es sich bei Zeigern nur um Ganzzahlen handelt, die als Adressen für andere Objekte im Speicher verwendet werden, bietet D verschiedene Leistungsmerkmale für die Zeigerarithmetik. Diese unterscheidet sich jedoch von der Ganzzahlarithmetik. Bei der Zeigerarithmetik wird die betreffende Adresse implizit durch Multiplikation oder Division der Operanden mit der bzw. durch die Größe des Typs angepasst, auf den der Zeiger verweist. Das folgende D-Fragment demonstriert diese Eigenschaft:

int *x;

BEGIN
{
	trace(x);
	trace(x + 1);
	trace(x + 2);
}

Dieses Fragment erzeugt einen ganzzahligen Zeiger x und verfolgt dann seinen Wert, seinen um 1 erhöhten und seinen um 2 erhöhten Wert. Wenn Sie dieses Programm erstellen und ausführen, meldet DTrace die ganzzahligen Werte 0, 4 und 8.

Da x ein Zeiger auf ein Objekt des Typs int ist (Größe 4 Byte), wird der zugrunde liegende Zeigerwert durch Inkrementierung von x um 4 erhöht. Diese Eigenschaft erweist sich als nützlich, wenn Sie Zeiger zum Verweis auf aufeinander folgende Speicherpositionen wie zum Beispiel Vektoren einsetzen möchten. Wenn beispielsweise x der Adresse eines Vektors a, wie dem in Abbildung 5–2 dargestellten, zugewiesen würde, so wäre der Ausdruck x + 1 gleichbedeutend mit dem Ausdruck &a[1]. Ebenso würde der Ausdruck *(x + 1) den Wert a[1] bezeichnen. Der D-Compiler implementiert Zeigerarithmetik immer dann, wenn ein Zeigerwert mit einem der Operatoren +=, + oder ++ inkrementiert wird.

Sie wird auch angewendet, wenn eine Ganzzahl von einem Zeiger auf der linken Seite subtrahiert, ein Zeiger von einem anderen Zeiger subtrahiert oder der Operator -- auf einen Zeiger angewendet wird. So würde beispielsweise das folgende D-Programm das Ergebnis 2 verfolgen:

int *x, *y;
int a[5];

BEGIN
{
	x = &a[0];
	y = &a[2];
	trace(y - x);
}