Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pointer (https://www.delphipraxis.net/15714-pointer.html)

Pseudemys Nelsoni 3. Feb 2004 09:22


Pointer
 
hoi,

kann mir jemand pointer erklären?(für mich verständlich erklären wenn es geht*G*), ich sehe in ihnen irgendwie kein vorteil. ich weiss nur das sie auf eine adresse zeigen. Ich weiss aber nicht mehr als:

Delphi-Quellcode:
procedure irgendwie;
var
  pi: ^integer;
  i: integer;
begin
  pi^ := Addr(i);
  // toll nun weiss ich das:
  i := 5;
  pi^ := 5;
  //das gleiche sind
end;


und wo ist da denn der vorteil?

neolithos 3. Feb 2004 20:38

Re: Pointer
 
Der Sinn der Pointer liegt darin, das es [egal] ist was inter jenem steht.

Bsp für Pointer Anwendungen:

- Binärdaten
- Verkettete Listen
- Hierachische Listen (hoffentlich hab ich das richtig geschrieben)
und alles was mir nicht einfällt.

Bsp für Binärdaten:

Delphi-Quellcode:
GetMem(p, 1024);


Byte(p^) := 128;
...


FreeMem(p); // in DOS FreeMem(p, 1024);

hboy 3. Feb 2004 20:47

Re: Pointer
 
Alles ist eigentlich ein Pointer. selbst wenn du
var
s: string;
hast ist s ein Pointer auf den Anfang des Strings im RAM.

selbst dein vertrautes Form1 ist nur ein Pointer. man kann pointer leicht übergeben ,z.B. in der EnumWindows Prozedur.

man kann einfach Ringspeicher realisieren (also verkettete Listen) und auch ganz einfach Baum- und Netzwerkstrukturen für Daten.
Die DIREKTE verwendung von Pointern ist aber leider etwas heikel ( jeder kennt die Fehler, Access Violation, Read of address ....)
deswegen haben Pointer keinen so guten Ruf bei programmieren.

Luckie 3. Feb 2004 20:49

Re: Pointer
 
Du willst was über Pointer erfahren: :mrgreen: Kuck dir hier das Video an. :tongue:

fkerber 3. Feb 2004 20:56

Re: Pointer
 
Da es mich auch interessiert:

Welches Video :?:

Ciao fkerber

Pseudemys Nelsoni 4. Feb 2004 09:50

Re: Pointer
 
danke, auch wenn ichs immernoch nicht kapiere *g*

@lueckie: video? ^^

Luckie 4. Feb 2004 10:20

Re: Pointer
 
Ich habe den Link vergessen. :roll:

http://cslibrary.stanford.edu/104/?

Pseudemys Nelsoni 6. Feb 2004 17:45

Re: Pointer
 
lol, das video is geil :mrgreen:

in dem video sah das ganze ja so aus:

Delphi-Quellcode:
var
  x: ^integer;
  y: ^integer;
begin
  x^ := 42;
  y^ := 13; // überschreibt die 42?
end;
wieso überschreibt y denn x? die haben doch garnichts miteinander zu tun oder?

mir sind pointer immernoch nicht klar (wird mir wohl nie klar werden :cry: )

überall wo ich sehe das pointer eingsetzt werden könnte ich genauso einfach "normale" variablen nehmen

SirThornberry 6. Feb 2004 18:00

Re: Pointer
 
Pointer zeigen ja eigentlich nur auf eine Stelle im Speicher.
Beispiel:
Delphi-Quellcode:
var normalint: Integer;
    zeigerint: ^Integer; //mit "^Integer" machen wir aus Integer einen Zeiger auf einen Integer
begin
  normalint := 5; //der normalen Integervariablen weisen wir jetzt irgendeinen wert zu
  zeigerint := @normalint;
  //um zeigerint wie einen normalen Integer verwenden zu können muss man den Zeiger dereferenzieren - also "zeigerint^" verwenden
  showmessage(inttostr(zeigerint^)); //und wenn wir uns jetzt zeigerint ausgeben lassen sieht man das da 5 rauskommt
  zeigerint^ := 7; //jetzt setzen wir zeigerint auf 7
  showmessage(inttostr(normalint)); //und wenn wir uns jetzt normalint anzeigen lassen steht da auch 7 weil wir ja an die stelle im speicher geschrieben haben wo normalint steht
end;
Ich hoffe es war einigermaßen verständlich, ansonsten nochmal posten was nicht verstanden wurde

und noch nen Beispiel aus nem beitrag den ich zum thema Pointer schonmal in nem thread gepostet hab
Delphi-Quellcode:
var gesamt: Array[0..1] of char;
    byte1, byte2: ^char;
begin
  byte1 := @gesamt[0]; //byte1 auf dein speicher von gesamt[0] zeigen lassen
  byte2 := @gesamt[1]; //byte2 auf dein speicher von gesamt[1] zeigen lassen
  byte1^ := 'a'; //an der stelle im speicher "a" schreiben
  byte2^ := 'b'; //an der stelle im speicher "b" schreiben
  self.caption := gesamt; //und siehe da, in gesamt steht später "ab"
end;

Pseudemys Nelsoni 6. Feb 2004 19:52

Re: Pointer
 
hoi, das ist sehr gut erklärt, danke :thuimb:

ich hätt noch eine frage jo :wink:, und zwar:

Zitat:

byte1 := @gesamt[0]; //byte1 auf dein speicher von gesamt[0] zeigen lassen
byte2 := @gesamt[1]; //byte2 auf dein speicher von gesamt[1] zeigen lassen

wieso haben byte1 und byte2 am ende kein "^" ? setzt man den nur ran bei werte-zuweisungen?

Danke nochmal, ist wirklich gut erklärt.


EDIT:

wäre:

byte1 := @gesamt[0]; //byte1 auf dein speicher von gesamt[0] zeigen lassen

und

byte1^ := gesamt[0]; //byte1 auf dein speicher von gesamt[0] zeigen lassen

nicht das gleiche?

d3g 6. Feb 2004 19:59

Re: Pointer
 
Zitat:

Zitat von Pseudemys Nelsoni
Delphi-Quellcode:
var
  x: ^integer;
  y: ^integer;
begin
  x^ := 42;
  y^ := 13; // überschreibt die 42?
end;

Du hast die Zuweisung von x zu y dazwischen vergessen, die im Video auch vorkommt.

Zitat:

Zitat von Pseudemys Nelsoni
hoi, das ist sehr gut erklärt, danke :thuimb:

ich hätt noch eine frage jo :wink:, und zwar:

Zitat:

byte1 := @gesamt[0]; //byte1 auf dein speicher von gesamt[0] zeigen lassen
byte2 := @gesamt[1]; //byte2 auf dein speicher von gesamt[1] zeigen lassen

wieso haben byte1 und byte2 am ende kein "^" ? setzt man den nur ran bei werte-zuweisungen?

byte1^ := @gesamt[0] hieße: In die Variable, auf die byte1 zeigt, die Adresse von gesamt[0] hineinschreiben. byte1 := @gesamt[0] bedeutet: byte1 auf die Adresse von gesamt[0] zeigen lassen.

SirThornberry 6. Feb 2004 20:17

Re: Pointer
 
@Pseudemys Nelsoni:
Delphi-Quellcode:
byte1 := @gesamt[0]; //byte1 auf dein speicher von gesamt[0] zeigen lassen
byte2 := @gesamt[1]; //byte2 auf dein speicher von gesamt[1] zeigen lassen
ist nicht das gleiche

byte1 und byte2 sind vom Typ "^Char" also ein Zeiger auf einen "Char" und ein Zeiger ist eine Adresse im speicher (Zahl)
Am besten man stellt sich einen Pointer als zahl vor.
Wenn du byte1 noch nix zugewiesen hast ist byte1 also irgend eine zahl
wenn du
Delphi-Quellcode:
byte1 := @gesamt[0]
schreibst wird byte1 die speicheradresse (zahl) von gesamt[0] zugewiesen
somit merkst du dir im prinzip in der variablen byte1 die anfangsspeicheradresse von gesamt[0]
Delphi-Quellcode:
byte1 := gesamt[0]
sollte also nicht gehen weil "gesamt[0]" keine zahl ist
deswegen dereferenziert man einen Zeiger
Wenn du also "byte11^" schreibst heißt es das du an die stelle im speicher wo byte1 hinzeigt was schreiben willst.. nochmal kurz zusammenfassend
-"@variablenname" gibt die speicheradresse der variablen zurück
-"pointer :=" lässt den zeiger auf eine andere position im speicher zeigen
-"pointer^ :=" schreibt was an die stelle im speicher wo pointer hinzeigt

Pseudemys Nelsoni 6. Feb 2004 20:20

Re: Pointer
 
ah, ich glaub so langsam versteh ich das (endlich) mal :mrgreen: thx.

Edit: ah, SirThornberry hat noch was geschrieben, das les ich dann jetzt mal, hatte das gar nicht gesehen

hatte mich bei meinem beispiel ganz verschrieben, ich meinte ob:

byte1 := @gesamt[0];

und:

byte1 := Addr(gesamt[0]);

das gleiche sind, sorry :oops:

SirThornberry 6. Feb 2004 20:33

Re: Pointer
 
jup, das ist das gleiche

Pseudemys Nelsoni 6. Feb 2004 20:43

Re: Pointer
 
danke, das hat mir gholfen :)


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

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