Datenfelder wurden bereits an anderer Stelle beschrieben. Der unsichere Leser möge dort nachlesen.
Hier sollen die besonderen Zugriffseigenschaften von Datenfeldern herausgestellt werden, weil diese im Vergleich zu anderen Datenstrukturen wesentlich sind.
Ein Datenfeld belegt einen zusammenhängenden Speicherbereich. Seine statische Größe kann also nicht einfach zur Laufzeit verändert werden.
Auf ein Element eines Datenfeldes wird durch die Angabe des Datenfeldnamens und eines Index zugegriffen. Bei einem unbenannten Datenfeld wird statt des Namens ein dereferenzierter Zeiger verwendet.
Beispiele:
Zahl[18] // Zugriff auf das 19. Element des Datenfeldes Zahl // PZahl referenziert ein Datenfeld (*PZahl)[3] // Zugriff auf das 4. Element des durch PZahl referenzierten Feldes Zeile[i++] // Zugriff auf das i-te Element das Datenfeldes Zeile // Nach dem Zugriff wird i inkrementiert. |
Beim Zugriff auf ein Element eines Datenfeldes wird die Zugriffsadresse berechnet.
Zugriffsadresse = Anfangsadresse des Datenfeldes + Offset
Die Anfangsadresse ist die dem Datenfeldnamen (z.B. Zahl, Zeile) zugeordnete Adresse beziehungsweise der Inhalt des Zeigers (z.B. PZahl). Der Offset ist der Wert, welcher sich aus dem Index und der Größe eines Elementes ergibt.
Offset = Index * sizeof(Elemententyp)
Wesentlich sind hier nicht die Einzelheiten, wie die Zugriffsadresse berechnet wird. Die Formeln sollen nur verdeutlichen, dass diese Adresse leicht berechnet werden kann. Diese Berechnung führt die CPU als eine ihrer leichtesten Übungen nebenbei durch.
Es sollte deutlich geworden sein, dass beim Zugriff auf ein Element die Zugriffsstelle (Adresse) aus allen Angaben (Datenfeld, Index) schnell berechnet wird, ohne diese Stelle erst suchen zu müssen.
Was aber ist zu tun, wenn ein Element an einer Stelle einzufügen ist?
Dann müssen alle hinter der Einfügestelle liegenden Elemente sukzessive eine Stelle nach hinten kopiert werden. Besonders aufwendig ist dies, wenn ein Element an der ersten Stelle eingefügt werden soll.
Entsprechend bedarf das Entfernen eines Elementes das Verschieben aller dahinter liegender Elemente um eine Stelle nach vorne.
Fazit:
1) In der STL gibt es auf Datenfelder basierende Vektoren, die ihre Größe ändern können. Dies ist jedoch mit viel Aufwand verbunden, deren Ursache in der von Natur aus statischen Größe eines Datenfeldes liegt.