Ein Array ist keine verkettete Liste sondern ein Array
Das Array ist ein einziger „Speicherblock“, in dem seine Element alle schön zusammenhängend hintereinander stehen.
Z.B. ein
arr: Array[0..4] of Integer
sieht im Speicher so aus (ein Integer ist 4 Bytes lang):
Code:
Adresse 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ...
Inhalt | arr[0] .| arr[1] .| arr[2] .| arr[3] .| arr[4] .|
(Wobei die Adresse hier relativ zur Startadresse des Array ist)
Da jedes Element die gleiche Länge hat, kann man ein bestimmtes Element einfach adressieren, indem man seine Position im Array mit der Länge eines Elements multipliziert.
Delphi-Quellcode:
arr: array of T;
arr[i] = (^T(@arr[0] + i * sizeof(T)))^;
Somit erfolgt der Zugriff auf ein beliebiges Element in konstanter Zeit.
Dynamische Arrays funktionieren genau so wie Arrays mit fester Größe, nur dass der vom Array allozierte Speicherbereich nachträglich vergrößert werden kann, wenn sich das Array füllt. Je nach Speichermanager kann das bedeuten, dass jedes mal, wenn die Länge vergrößert wird, ein neuer Speicherbereich alloziert wird und alle Elemente vom alten, kleineren Speicherbereich in den neuen, größeren umkopiert werden müssen. Deshalb sollte man auch
nicht Elemente so einfügen:
Delphi-Quellcode:
var
arr: array of Integer;
i: integer;
begin
for i := 1 to 100 do
begin
SetLength(arr, Length(arr)+1);
arr[high(arr)] := i;
end;
end;
Stattdessen sollte man gleich die richtige Länge setzen:
Delphi-Quellcode:
var
arr: array of Integer;
i: integer;
begin
SetLength(arr, 100);
for i := 1 to 100 do
arr[i-1] := i;
end;
Wenn man die Länge nicht von Anfang an weiß, dann sollte man möglichst in größeren Blöcken allozieren (und sich ggf. die echte Anzahl der Elemente in einer Extra-Variablen merken... TList macht es auch so (siehe Capacity vs. Count)).
Genaueres dazu kannst du auf
Wikipedia lesen.