AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Unterschied Pointer/Referenzvariablen

Ein Thema von Kouran · begonnen am 1. Mär 2006 · letzter Beitrag vom 1. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Kouran
Kouran

Registriert seit: 1. Mär 2006
3 Beiträge
 
#1

Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 20:34
heho hab mal ne Frage,

kann mir jemand genau erklären, wo der Unterschied zwischen Pointern und Referenzvariablen auf Objekte liegt? Beide enhalten doch gewissermaßen Referenzen auf Objekte. Was kann ich mit Pointern machen was ich mit Referenzvariablen nicht machen kann, oder umgekehrt? Oder habe ich da einfach prinzipiell was falsch verstanden?

unter Pointern verstehe ich:
PMyClass = ^TMyClass; unter Referenzvariablen:
var fubar: TMyClass; thx schonmal im voraus

Kora
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 20:39
Hallo und Herzlich Willkommen in der Delphi-PRAXiS!

Das Geheimnis, welches Delphi gut vor einem verbirgt, lautet: Eine Objektreferenz ist ein Pointer.
Somit ist also bei
PMyClass = ^TMyClass; PMyClass ein Pointer auf einen Pointer.

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 20:44
[entfernt]
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#4

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 20:46
in delphi sind alle klassen die mit dem schlüsselwort "class" deklariert wurden bereits pointer auf die interne repräsentation der klasse.
wenn du jetzt einen pointer auf tsomeclass nimmst hast du also nicht nur einen pointer auf diese struktur sondern einen pointer auf einen pointer auf eine solche struktur. im normalen gebrauch macht das keinerlei sinn und bietet lediglich fehlerquellen. wo es aber sinn macht ist bei funktionsparametern:
Delphi-Quellcode:
procedure myProcedure(aObject: PSomeClass);
begin
  // hier kann ich den pointer dereferenzieren und auf die member zugreifen
  aObject^.SomeMethod;
  // oder ich kann ein anderes Objekt in meinen dereferenzierten Pointer stecken
  aObject^ := TSomeClass.Create;
end;
wäre aObject kein pointer so würde in der letzten lediglich die lokale kopie verändert werden. der aufrufer der myProcedure aufgerufen hat würde von der veränderung nichts mitkriegen. jetzt existiert aber nur eine lokale kopie des pointers nicht aber der objektreferenz. diese kann ich also ändern und der aufrufer wird entsprechend feststellen daß hinter dem pointer jetzt ein anderes objekt steckt.
das ganze ist syntaktisch gleichbedeutend mit einem var parameter:
Delphi-Quellcode:
procedure myProcedure(var aObject: TSomeClass);
begin
  aObject.SomeMethod;
  aObject := TSomeClass.Create;
end;
bei einem var parameter kann ich mir lediglich das dereferenzieren sparen der effekt ist aber der gleiche.
c++ kenntnisse können hier hilfreich sein da man dort eine klare trennung zwischen objekten und objektreferenzen hat.
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 20:51
Zitat von Frickeldrecktuxer_TM:
in delphi sind alle klassen die mit dem schlüsselwort "class" deklariert wurden bereits pointer auf die interne repräsentation der klasse.
wenn du jetzt einen pointer auf tsomeclass nimmst hast du also nicht nur einen pointer auf diese struktur sondern einen pointer auf einen pointer auf eine solche struktur. im normalen gebrauch macht das keinerlei sinn und bietet lediglich fehlerquellen. wo es aber sinn macht ist bei funktionsparametern:
Delphi-Quellcode:
procedure myProcedure(aObject: PSomeClass);
begin
  // hier kann ich den pointer dereferenzieren und auf die member zugreifen
  aObject^.SomeMethod;
  // oder ich kann ein anderes Objekt in meinen dereferenzierten Pointer stecken
  aObject^ := TSomeClass.Create;
end;
wäre aObject kein pointer so würde in der letzten lediglich die lokale kopie verändert werden. der aufrufer der myProcedure aufgerufen hat würde von der veränderung nichts mitkriegen. jetzt existiert aber nur eine lokale kopie des pointers nicht aber der objektreferenz. diese kann ich also ändern und der aufrufer wird entsprechend feststellen daß hinter dem pointer jetzt ein anderes objekt steckt.
das ganze ist syntaktisch gleichbedeutend mit einem var parameter:
Delphi-Quellcode:
procedure myProcedure(var aObject: TSomeClass);
begin
  aObject.SomeMethod;
  aObject := TSomeClass.Create;
end;
bei einem var parameter kann ich mir lediglich das dereferenzieren sparen der effekt ist aber der gleiche.
c++ kenntnisse können hier hilfreich sein da man dort eine klare trennung zwischen objekten und objektreferenzen hat.
Seit wann ist dem so??? Gerade wenn Du ein Objekt übergibst, wird das so gehandhabt als wäre der Parameter mit "var" deklariert worden. Das trifft nur auf einfache Datentypen zu nicht aber auf Objekte.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 20:55
Zitat:
Seit wann ist dem so???
Seit es Delphi gibt.
Zitat:
Das trifft nur auf einfache Datentypen zu nicht aber auf Objekte.
Stimmt nicht.
Zitat:
c++ kenntnisse können hier hilfreich sein da man dort eine klare trennung zwischen objekten und objektreferenzen hat.
Das kann man nur zustimmen.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von Kouran
Kouran

Registriert seit: 1. Mär 2006
3 Beiträge
 
#7

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 20:59
ok danke hat meine Frage soweit beantwortet. Würde mich nur noch interessieren an einem konkreten Beispiel, wo ich Pointer dann sinnvoll (außerhalb von Objekten?) benutzen kann.

Kora
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#8

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 21:09
@GünterS:
das ist schon immer so. führe folgenden code aus:
Delphi-Quellcode:
type
  TSomeClass = class
    data: Integer;
  end;


procedure DoSomething(aObject: TSomeClass);
begin
  aObject := TSomeClass.Create;
  aObject.data := 42;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  obj: TSomeClass;
begin
  obj := TSomeClass.Create;
  obj.data := 23;
  DoSomething(obj);
  ShowMessage(obj.data);
end;
dir ist wahrscheinlich genau das passiert, was viele bei objekten zunächst nicht verstehen nämlich daß es nur eine objektreferenz deren objekt ich zwar manipulieren kann die ich aber selbst nicht ändern kann weil sie lediglich eine lokale kopie ist.

@Kouran:
außer in altem code gar nicht. einige winapi funktionen verlangen noch pointer auf strukturen aber prinzipiell kannst du alles was mit pointern möglich ist auch mit objekten erreichen. zum beispiel kannst du verkettete listen mit objekten genauso machen wie mit pointern auf records und es macht für die funktionalität keinerlei unterschied. das heißt du kannst mittlerweile fast komplett ohne pointer programmieren. das prinzip solltest du dennoch verstehen weil es dir bei objekten begegnet.
  Mit Zitat antworten Zitat
JocalAreaNetwork

Registriert seit: 19. Aug 2005
35 Beiträge
 
Delphi 2006 Architect
 
#9

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 21:13
Ich persönlich benutze Pointer selten nur für Datentypen, sondern eher für Pointer auf Funktionen, die sich eben als Event registrieren oder Ähnliches. Definitiv sind Pointer auch nützlich, wenn man eben anfängt mit dynamischen Datenstrukturen zu arbeiten, also Bäume implementiert etc ( siehe New, Dispose, GetMem, FreeMem )

Anschließen kann ich mich jedoch meinen Vorrednern - imho ist das alles in C++ sichtbarer, auch wenn es natürlich etwas Einarbeitung am Anfang benötigt.

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Unterschied Pointer/Referenzvariablen

  Alt 1. Mär 2006, 21:16
Zitat von sniper_w:
Zitat:
Seit wann ist dem so???
Seit es Delphi gibt.
Zitat:
Das trifft nur auf einfache Datentypen zu nicht aber auf Objekte.
Stimmt nicht.
Zitat:
c++ kenntnisse können hier hilfreich sein da man dort eine klare trennung zwischen objekten und objektreferenzen hat.
Das kann man nur zustimmen.
So jetzt widerlege ich mal die ersten zwei Punkte von Sniper_w, sogar mit Beweis zum selber ausprobieren.

Hab ihn als Anhang angehängt.

Man wird darin sehen, dass es keinen Unterschied macht ob ich nun

"var MyOBJ: TMyClass" oder "MyObj: TMyClass" schreibe

man wird sehen, dass es einen Unterschied macht ob ich nun

"myInt: integer" oder "var myInt: integer" schreibe.

Hm Ok, in meinem Beispiel sieht man auch schön den Unterschied zwischen dem was Frickeldrecktuxer_TM geschrieben hat und dem was ich da gmacht habe. Wenn man nicht ausgerechnet die Klasse in der Methode erzeugt oder austauschen möchte, sondern lediglich mit dem Objekt arbeiten möchte, dann macht das schon einen Unterschied.
Angehängte Dateien
Dateityp: zip projects_211.zip (191,1 KB, 5x aufgerufen)
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf