Zeiger vs. Array
Ein Zeiger ist ein Datentyp, der einen Verweis auf eine Speicherstelle enthält (d. h. eine Zeigervariable speichert eine Adresse einer Speicherstelle, in der einige Daten gespeichert sind). Arrays sind die am häufigsten verwendete Datenstruktur zum Speichern einer Sammlung von Elementen. Die meisten Programmiersprachen bieten Methoden, um Arrays einfach zu deklarieren und auf Elemente in den Arrays zuzugreifen.
Was ist ein Zeiger?
Ein Zeiger ist ein Datentyp, der eine Adresse eines Speicherplatzes speichert, an dem einige Daten gespeichert sind. Mit anderen Worten, ein Zeiger enthält einen Verweis auf eine Speicherstelle. Der Zugriff auf die Daten, die an der Speicherstelle gespeichert sind, auf die durch den Zeiger verwiesen wird, wird Dereferenzierung genannt. Beim Durchführen sich wiederholender Operationen wie dem Durchlaufen von Bäumen/Strings, Tabellensuchen usw. würde die Verwendung von Zeigern die Leistung verbessern. Dies liegt daran, dass das Dereferenzieren und Kopieren von Zeigern billiger ist als das tatsächliche Kopieren und Zugreifen auf die Daten, auf die die Zeiger zeigen. Ein Nullzeiger ist ein Zeiger, der auf nichts zeigt. In Java würde der Zugriff auf einen Nullzeiger eine Ausnahme namens NullPointerException erzeugen.
Was ist ein Array?
In Abbildung 1 ist ein Codestück dargestellt, das normalerweise verwendet wird, um Werte zu deklarieren und einem Array Werte zuzuweisen. Abbildung 2 zeigt, wie ein Array im Speicher aussehen würde.
int Werte[5]; values[0]=100; values[1]=101; values[2]=102; values[3]=103; values[4]=104; |
Abbildung 1: Code zum Deklarieren und Zuweisen von Werten zu einem Array
100 | 101 | 102 | 103 | 104 |
Index: 0 | 1 | 2 | 3 | 4 |
Abbildung 2: Im Speicher abgelegtes Array
Der obige Code definiert ein Array, das 5 Ganzzahlen speichern kann und auf die über die Indizes 0 bis 4 zugegriffen wird. Eine wichtige Eigenschaft eines Arrays ist, dass das gesamte Array als ein einzelner Speicherblock zugewiesen wird und jedes Element seinen erhält eigenen Platz im Array. Sobald ein Array definiert ist, ist seine Größe festgelegt. Wenn Sie also zur Kompilierzeit nicht sicher sind, wie groß das Array ist, müssen Sie ein Array definieren, das groß genug ist, um auf der sicheren Seite zu sein. Aber meistens werden wir tatsächlich weniger Elemente verwenden, als wir zugewiesen haben. Es wird also tatsächlich eine beträchtliche Menge an Speicher verschwendet. Wenn andererseits das „large enough array“nicht wirklich groß genug ist, würde das Programm abstürzen.
Was ist der Unterschied zwischen Zeigern und Arrays?
Ein Zeiger ist ein Datentyp, der eine Adresse eines Speicherplatzes speichert, an dem einige Daten gespeichert sind, während Arrays die am häufigsten verwendete Datenstruktur zum Speichern einer Sammlung von Elementen sind. In der Programmiersprache C erfolgt die Indizierung von Arrays mithilfe von Zeigerarithmetik (d. h. das i-te Element des Arrays x wäre äquivalent zu (x+i)). Daher kann man sich in C einen Satz von Zeigern, die auf einen Satz aufeinanderfolgender Speicherorte zeigen, als ein Array vorstellen. Außerdem gibt es einen Unterschied darin, wie der sizeof-Operator auf Zeiger und Arrays wirkt. Bei Anwendung auf ein Array gibt der sizeof-Operator die gesamte Größe des Arrays zurück, während er bei Anwendung auf einen Zeiger nur die Größe des Zeigers zurückgibt.