Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dereferenzierungsoperator ^ (https://www.delphipraxis.net/151124-dereferenzierungsoperator-%5E.html)

JnZn558 6. Mai 2010 14:40


Dereferenzierungsoperator ^
 
Delphi-Quellcode:

type
 
  ptest = ^test;
  test = record
     a: integer;
  end;

var
   pp: ptest;
   p: test;

   p.a := 3;
   pp := @p;
   writeln(IntToStr( pp.a ) );    // es wundert mich, wieso das hier auch funktioniert.
   writeln(IntToStr( pp^.a ) );   // das hier is der ueblich, den ich kenne.
wieso funktioniert es auch ohne derefenzierung operator? wenn es "einwandfrei" funktioniert, dann kann man wohl auch das ^ wohl weglassen oder?

Medium 6. Mai 2010 14:47

Re: Dereferenzierungsoperator ^
 
Der "." vereint im gewissen Sinne die C-Operatoren "." und "->", und Delphi versucht dabei intelligent vorzugehen. Wenn man einer (typisierten!) Zeigervariablen den "." folgen lässt, geht der Compiler automatisch davon aus, dass man wohl dereferenzieren wollte. Gleiches gilt ja auch bei Klasseninstanzen, die auch eiegntlich nur Pointer sind, wo es aber semantisch richtiger ist nicht explizit dereferenzieren zu müssen, da zumindest theoretisch Referenz<>Pointer ist.
Ist ein wenig inkonsequent, aber kam wohl mit der OO als Nebeneffekt mit dazu. Ich persönlich würde explizite Dereferenzierung bevorzugen, da dann im Kontext ersichtlich ist, dass es da wirklich explizit auch semantisch um einen Pointer geht.

mkinzler 6. Mai 2010 14:49

Re: Dereferenzierungsoperator ^
 
Delphi ist in diesem Fall gutmütig. Eigentlich muss man einen Zeiger dereferenzieren. In FreePascal ist es auch ein Muss.

JnZn558 6. Mai 2010 14:56

Re: Dereferenzierungsoperator ^
 
gut zu wissen, es mag fuer anfaenger gut zu sein, diese moeglichkeit kann aber bei programmfehler sehr schwer zu finden sein. dagegen is strikte regeln wie C++ etwas besser.

mkinzler 6. Mai 2010 14:59

Re: Dereferenzierungsoperator ^
 
Mit C/C++ als strikt zu bezeichnen, wäre ich jetzt vorsichtig. Normalerweise ist Delphi die striktere Sparche ( obwohl diese im Vergleich zu Pascal etwas gelockert wurde, u.a. auch wegen C++/C-Builder VCL)

Medium 6. Mai 2010 15:01

Re: Dereferenzierungsoperator ^
 
Nuja, dafür ist Delphi an vielen anderen Stellen deutlich strikter als C. Aber wie gesagt, ich bevorzuge auch auf jeden Fall die "richtigere" Notation, ohne von dieser Krücke gebrauch zu machen. Wobei die Möglichkeiten damit wirklich mal auf die Nase zu fallen auch nicht wirklich viele sind, bzw. schon recht speziell - so dass ich eher nicht glaube, dass ein Anfänger jemals darauf stoßen würde.

BUG 6. Mai 2010 15:35

Re: Dereferenzierungsoperator ^
 
Weitere philosophische Betrachtungen zu dem Thema Dereferenzierungsoperator finden sich auch hier :mrgreen:

himitsu 6. Mai 2010 17:42

Re: Dereferenzierungsoperator ^
 
Man muß in diesem Fall nur wissen, daß Delphi weiß, sobald man über den Punkt zugreift, daß man natürlich nur den Dereferenzierten Pointer meinen kann und es demnach automatisch dereferenzieren kann.

Ist genauso wie bei Prozedur-Zeigern, wenn man soeinem Zeiger eine Prozedur zuweisen will, dann benötigt man kein @.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 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