Einzelnen Beitrag anzeigen

Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Totale Pointer-Verwirrung

  Alt 9. Jan 2006, 13:32
Ein PDouble ist einfach ein double *.

Ein "array of Double" ist ein dynamischer Datentyp wie "string".
Ich erklaere es mal anhand von string. Alle "array of" Typen funktionieren im Prinzip genauso.

string ist in Delphi der Datentyp der einer echten Klasse am naechsten kommt.
Wie bei jedem anderen Objekt auch ist die Variable ein Pointer auf das dynamisch alloziierte Objekt.
Deklariert man eine string Variable so wird sie automatisch am Beginn der Funktion instanziiert.
Es kommt allerdings ein Trick zum Einsatz. Die Variable wird nur mit nil initialisiert. Das ist die Repraesentation des Leerstrings.
Am Ende der Funktion wird das Objekt automatisch geloescht.

Weist man einem string etwas zu so wird alloziiert. Im string enthalten ist ein C string mit #0 am Ende.
Zusaetzlich wird noch die Groesse des alloziierten Bereichs und ein Referenzzaehler angelegt.
Der gelieferte Zeiger zeigt auf den Beginn des C strings. Groesse und Referenzzaehler liegen davor!

Weist man die Variable einer andren Variablen zu so wird nur der Referenzzaehler erhoeht.
Aendert man den Inhalt so wird der string geklont (copy-on-write).

Nun kann man leicht erkennen das SetLength einem realloc() plus copy-on-write entspricht.

Der Zugriff auf einen Char im string (z. B. Variable[1]) entspricht einem ueberladenen Operator, denn string ist 1-basiert waehrend "array of" 0-basiert ist.
Die Umtypung eines strings zu einem char * mit PChar() ist in Wirklichkeit ein Funktionsaufruf, da der Sonderfall Leerstring beruecksichtigt werden muss und der String moeglicherweise geklont werden muss.

"array of" ist etwas einfacher gestrickt. Es gibt keinen Referenzzaehler.
Es gibt aber eine Laenge, die mit SetLength auch veraendert werden kann.

Mehrdimensionale Arrays also "array of array of ..." stapeln einfach.
Insbesondere kann man mit SetLength auch einzelne Dimensionen aendern!
  Mit Zitat antworten Zitat