Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [basics] pointer (https://www.delphipraxis.net/23549-%5Bbasics%5D-pointer.html)

Skyruner2 4. Jun 2004 22:02


[basics] pointer
 
ich höre es so oft, und jetzt will ne Funktion meiner TADOQUery auch noch einen haben.. :shock:,
aber um ehrlich zu sein, ich hab keine wirkliche Idee was so ein Pointer is. :stupid:

hatten wir noch nicht in info, und bis jetzt brauchte ich noch nie einen :wall:

könnte mich bitte jemand aufklären: was ist ein Pointer, warum sind sie so besonders, und wie benutze ich sie?

edit:
hab nen bissel wat online gelesen, aber leider ist die Delphi hilfe datei für die TADO komponenten kaput. kann mir einer was sagen zu TADOQuery.GetFieldData(FieldNo:integer,Buffer:poin ter)?


edit2:
Delphi-Quellcode:
Type adothing=^integer;
var lastrecord:adothing;
Adoquery_news.GetFieldData(0,lastrecord);
das geht, aber wie kann ich jetzt lastrecord in eienen string verwandeln? (fieldNo 0 is ein integer, daher Type adothing=^integer;)

Christian Seehase 4. Jun 2004 23:52

Re: [basics] pointer
 
Moin Skyruner,

Pointer von to point = zeigen
Es ist also ein Zeiger (auf einen Speicherbereich).

Das heisst nichts anderes, als er die Adresse einer Speicherstelle enthält.
Wie diese jetzt zu interpretieren ist, hängt vom Zusammenhang ab.

In Deinem Falle ist adothing als Pointer auf ein integer deklariert (üblicher wäre Padothing. Präfix P für Pointer).
Ein integer ist ein 32 Bit Wert mit Vorzeichen, somit sieht der Compiler den Wert, der an die Adresse die adothing enthält als integer Wert an.

Auslesen kannst Du den Wert dann durch das sogenannte Dereferenzieren mit ^

Das sähe dann z.B. so aus:

Delphi-Quellcode:
ShowMessage(IntToStr(lastrecord^));
durch das ^ wird dem Compiler gesagt, dass der Wert auf den lastrecord zeigt ausgelesen werden soll. Da es ein Pointer auf einen Integer ist, funktioniert das auch problemlos.

Damit das Füllen überhaupt funktioniert, müsste allerdings zu Anfang einmal Speicher reserviert werden, z.B. so:

Delphi-Quellcode:
lastrecord := AllocMem(4);
jetzt enthält lastrecord die Adresse eines vier Byte grossen, mit 0 initialisierten Speicherbereiches, so dass die Funktion einen Integerwert an dieser Adresse ablegen kann.

Zitat:

Zitat von Skyruner2
warum sind sie so besonders, und wie benutze ich sie?

Besonders...?
Da versteh' ich jetzt nicht, was Du meinst.
In Delphi sind sie oft besonders, weil die sogenannte Compilermagic vieles vor dem Entwickler verbirgt, bzw. automatisch erledigt, worum man sich sonst selber kümmern müsste.
Beispielsweise enthalten Variablen von Objekten (z.B. Form1) auch nur Pointer. Dank des Compilers muss man bei diesen aber nicht selber dereferenzieren.

Was vielleicht noch erwähnenswert ist:
Wird ein typisierter Pointer (also auf einen bestimmten Datentyp, wie in Deinem Beispiel) mittels inc erhöht, so wird er automatisch um die Grösse (sizeof) des Typs erhöht.
Es ist ein "beliebter" Fehler, hier selber die Grösse anzugeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz