Handbuch zur dynamischen Ablaufverfolgung in Solaris

Beziehung zwischen Zeigern und Vektoren

Ebenso wie in ANSI-C besteht auch in D eine besondere Beziehung zwischen Zeigern und Vektoren. Ein Vektor wird durch eine Variable dargestellt, der die Adresse ihrer ersten Speicherposition zugewiesen ist. Auch ein Zeiger ist die Adresse einer Speicherposition mit einem definierten Typ. In D ist also die Verwendung der Vektorindex-Notation [ ] sowohl für Zeiger- als auch Vektorvariablen zulässig. So haben beispielsweise die beiden folgenden D-Codefragmente dieselbe Bedeutung:

p = &a[0];				trace(a[2]);
trace(p[2]);

Im Fragment auf der linken Seite wird durch Anwendung des Operators & auf den Ausdruck a[0] der Zeiger p die Adresse des ersten Vektorelements in a zugewiesen. Der Ausdruck p[2] verfolgt den Wert des dritten Vektorelements (Index 2). Da p jetzt die auch a zugewiesene Adresse enthält, ergibt dieser Ausdruck denselben Wert wie a[2] im rechten Codefragment. Eine Konsequenz dieser Gleichbedeutung ist, dass C und D den Zugriff auf jeden Index eines beliebigen Zeigers oder Vektors zulassen. Weder der Compiler noch die DTrace-Laufzeitumgebung führen eine Überprüfung der Vektorgrenzen durch. Bei einem Zugriff auf eine Speicherposition außerhalb des vordefinierten Werts eines Vektors erhalten Sie entweder ein unerwartetes Ergebnis oder DTrace meldet wie im vorigen Beispiel einen Fehler aufgrund einer ungültigen Adresse. Wie immer, können Sie auch hierdurch weder DTrace noch das Betriebssystem beeinträchtigen, müssen aber den Fehler im D-Programm beseitigen.

Der Unterschied zwischen Zeigern und Vektoren besteht darin, dass eine Zeigervariable auf separaten Speicher verweist, der die ganzzahlige Adresse eines anderen Speichers enthält. Eine Vektorvariable benennt den Speicherbereich des Vektors selbst und nicht etwa die Position einer Ganzzahl, die ihrerseits die Position des Vektors enthält. Dieser Unterschied geht aus dem folgenden Schaubild hervor:

Abbildung 5–2 Speicherung von Zeigern und Vektoren

Schaubild eines Zeigers auf einen Vektor mit fünf Objekten.

Dieser Unterschied kommt in der D-Syntax zur Geltung, wenn Sie versuchen, Zeiger und skalare Vektoren zuzuweisen. Wenn x und y Zeigervariablen sind, ist der Ausdruck x = y zulässig. Er kopiert einfach die Zeigeradresse aus y an die mit x angegebene Speicherposition. Wenn x und y skalare Vektorvariablen sind, ist der Ausdruck x = y nicht zulässig. Eine Zuweisung von Vektoren als Ganze ist in D nicht möglich. Es können aber in jedem Kontext, in dem Zeiger zulässig sind, Vektorvariablen oder Symbolnamen verwendet werden. Handelt es sich bei p um einen Zeiger und bei a um einen Vektor, dann ist die Anweisung p = a erlaubt. Sie ist gleichbedeutend mit der Anweisung p = &a[0].