![]() Vorherige Seite |
![]() Eine Ebene hoch |
![]() Nächste Seite |
---|
Deutlicher wird der Unterschied bei zweidimensionalen Vektoren im Vergleich zu Zeigervektoren. Soll ein zweidimensionales Datenfeld bearbeitet werden, so lässt sich das einfach mit einem zweidimensionalen Vektor realisieren. Beispiel:
int b[10][10];
Das zweidimensionale Datenfeld kann auch mit einem Zeigervektor realisiert werden:
int dummy[10*10], *c[10], i; c[0] = dummy; for(i=1; i<10; i++) c[i] = c[i-1]+10;
Hier ist die Variable dummy ein eindimensionaler Vektor mit 10*10=100 Elementen. Die Variable c ist ein Vektor (eine Kette) von 10 Zeigern auf int. Nach der Zuweisung c[0]=dummy; zeigt der erste Zeiger von c auf das erste Element von dummy. Mit der for-Schleife wird dafür gesorgt, dass die folgenden Zeiger in c auf jedes zehnte Element von dummy zeigen.
Nach diesem Programmstück können die Variablen b und c wieder gleichermaßen verwendet werden. (In diesem Beispiel haben die beiden Variablen aber unterschiedliche Speicherbereiche für sich reserviert.) Die zwei Zeilen
b[3][4] = 23; printf("Wert bei (3; 4): %d\n", b[3][4]);würden mit der Variable c statt b zum selben Ergebnis führen.
Was sind nun die Unterschiede zwischen der Vektor- und der Zeiger-Version?
Der zweidimensionale Vektor reserviert Speicher (nur) für seine 100 Elemente. Da die Zeilen des zweidimensionalen Datenfelds im Speicher hintereinander abgelegt sind, muss die Stelle im Speicher wie folgt berechnet werden: Index1 * Anzahl pro Zeile + Index2 (im Beispiel 3*10+4).
Für die Methode mit dem Zeigervektor muss neben den 100 Elementen auch Speicher für den Zeigervektor selbst reserviert werden. Um ein bestimmtes Element zu selektieren wird vom Zeigervektor der Zeiger mit der Nummer Index1 genommen, und der Index2 dazuaddiert. Im Beispiel könnte man statt c[3][4] auch *(c[3]+4) schreiben.
Was ist nun der Vorteil des Einen gegenüber dem Anderen?
Der zweidimensionale Vektor hat den Vorteil, dass er einfach zu handhaben ist, und das er keinen extra Speicher für einen Zeigervektor benötigt.
Der Zeigervektor ist in der Ausführung schneller, da er bei der Berechnung der Speicherposition der Elemente eine Multiplikation einspart. Ein weiterer Vorteil ist, dass die Zeilen unterschiedlich lang sein können. Stellen Sie sich als Beispiel das Dreieck von Pascal vor. Ein weiterer Vorteil liegt in der Möglichkeit, die Daten an verschiedenen Stellen im Speicher abzulegen.
Die folgende Übersicht fasst die Vor- und Nachteile tabellarisch zusammen. Eine allgemeine Bewertung des Vergleichs Zeigervektor contra 2d Vektor lässt sich nicht treffen. Je nach Anwendungsgebiet ist das eine dem anderen zu bevorzugen.
2d Vektor | Zeigervektor | |
---|---|---|
Speicherbedarf | nur 100 Elemente (+) | 100 Elemente + Zeigervektor (-) |
Geschwindigkeit | extra Multiplikation (-) | keine extra Multiplikation (+) |
Erstellung | simpel (+) | aufwändig (-) |
Flexibilität | alle Zeilen gleich lang (-) | variable Zeilenlänge möglich (+) |
Verteilung im Speicher | als ein Block (-) | kann verteilt werden (+) |