Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

niratschi

Frischling

  • »niratschi« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

1

04.04.2011, 19:47

Referenzen oder Zeiger - Aufgabengebiete

Hi

Ich habe gerade das Kapitel "Referenzen und Zeiger" hinter mir und soweit auch denke ich das meiste verstanden. Mir ist allerdings noch etwas unklar:

Heiko Kalista schreibt, dass man Pointer als Parameter verwenden sollte, wenn eine Variable oder eine Instanz von der Funktion verändert wird. Dahingegen sollte man Referenzen (nur) dann verwenden, wenn man größere Objekte an Funktionen übergibt, die nicht verändert werden sollen.

Vorteil des Pointers soll sein, dass man schon beim Funktionsaufruf erkennt, dass der Wert des Zieles geändert werden kann. Bei der Referenz sei es nicht direkt einsichtlich, ob es sich um ein Call by Value oder Call by Reference handle.

So weit so gut...

Ich frage mich nur ob es nicht sinnvoller ist trotzdem vorwiegend mit Referenzen zu arbeiten, da erstens die Syntax einfacher ist und vielmehr zweitens bei Pointern schwerwiegende Fehler auftreten können, wenn man Sie falsch benutzt.

Was meint ihr dazu?
++++++[>+++++++++++>+++++++<<-]>+.>+..

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

04.04.2011, 20:02

Sehe ich grundsätzlich so wie du. Das Argument, dass der Aufrufer gleich sieht, dass Objekt verändert werden kann zieht bei mir nicht so ganz. Da finde ich die Sicherheit, die eine Referenz gegenüber Zeigern hat einiges wichtiger. Ob das Objekt verändert werden kann sollte dann aus dem Kontext und dem Funktionsnamen recht ersichtlich sein.

Meine Faustregel ist: Referenzen vor Zeigern. Zeiger nur, wenn das, was ich erreichen will mit Referenzen nicht möglich ist. Meistens sind das ja sowieso lediglich (konstante) Argumente und da sind Referenzen besser geeignet.

Zeiger benutze ich dann hauptsächlich nur (die Ausnahme bestätigt nat. die Regel), wenn ich die Eigenschaft brauche, dass auch kein Objekt referenziert werden kann. Dann programmiert man ja auch gleich mit dem Nutzen im Hinterkopf und die Fehler, dass man einen 0-Zeiger dereferenziert ist dann eher ein logisches Problem.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

04.04.2011, 20:11

Ich seh in Zeigern und Referenzen eigentlich zwei, wenn auch ähnliche aber doch, grundverschiedene Dinge. Ein Zeiger ist ein eigenständiges Objekt welches die Adresse eines anderen Objektes als Wert hat über die das andere Objekt referenziert werden kann. Das Ziel eines Zeigers kann verändert werden und er kann auch auf nichts zeigen (Nullpointer). Eine Referenz dagegen ist mehr oder weniger das Objekt an das sie gebunden wurde selbst und nicht wirklich ein eigenständiges Objekt (es ist z.B. unmöglich die Adresse einer Referenz zu bestimmen). Das Ziel einer Referenz kann nicht verändert werden und es gibt keine Nullreferenz. Zeiger verwendet man dort wo man die Funktionalität eines Zeigers benötigt und Referenzen dort wo man die Funktionalität einer Referenz benötigt.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

4

04.04.2011, 20:18

Allerdings kann es auch bei Referenzen zu schwerwiegenden Fehlern kommen, wenn man diese falsch verwendet.
Und es gibt auch Situationen, in denen man bspw. einen Pointer braucht, weil man bspw. eine Liste mit Pointern hat, wo eben ein weiterer dazu kommen soll. Da hielte ich es auch für etwas aufwendig, der Funktion als Parameter eine Referenz zu geben, und mit dieser dann trotzdem als Zeiger weiter zu arbeiten.
Weiterhin sehe ich den Null-Zeiger eher als einen Vorteil des Zeigers an, den man mit einer Referenz nicht hat. Natürlich kann es, wenn man nicht aufpasst, zu Problemen kommen, aber man kann bspw. eine Funktion einen Null-Zeiger zurückgeben lassen(wenn bspw. ein Fehler aufgetreten ist) und kann diesen dann abfangen und ggf. alles weiter abbrechen oder eine Exception werfen oder den Nutzer informieren, dass ein entsprechender Zeiger nicht existiert oder sonstigen Quatsch^^.
Also es gibt eben verschiedene Anwendungsbereiche, in denen man auf das eine oder andere zurückgreifen sollte.
Ich persönlich verwende egtl. sogar lieber Zeiger(wenn ich die Wahl habe), aber wie gesagt gibt es eben verschiedene Situationen, in denen das eine oder andere empfehlenswerter ist.

niratschi

Frischling

  • »niratschi« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

5

04.04.2011, 22:29

Hey danke für die Antworten,
ich seh schon um diese Frage für mich weitgehend beantworten zu können, muss ich erstmal weiter abwarten, was man mit pointern noch so alles anstellen kann, zB das zeigen auf Objekte. Bis jetzt hatte ich ja nur Pointer auf Strukturen oder Variablen, da gibt es noch nicht viele Unterschiede zwischen Pointer oder Referenz.

Ich lese erstmal weiter, wenn es dann zu Nullpointern und Pointer auf Objekte kommt wird es bestimmt klarer.

Danke soweit schonmal
++++++[>+++++++++++>+++++++<<-]>+.>+..

6

04.04.2011, 23:35

Meine Meinung dazu: Zeiger und Referenzen machen prinzipiell das selbe, dass die Syntax ein wenig anders ist, sollte einen nicht mehr stören, wenn man ein wenig C++ Erfahrung hat.
Referenzen benutze ich immer dann, wenn ich einen gescheiten Initialisierungswert habe, und die Referenz sich nie ändern soll, also immer dann, wenn es möglich ist. Größere Objekte kann man beispielsweise wunderbar per konstante Referenz übergeben, so ist es ein wenig schneller und man muss sich nicht sorgen, versehentlich das Objekt zu manipulieren. Aber wir achten ja alle sowieso auf const-correctness, nicht wahr?^^
Man hört manchmal, Referenzen seien sicherer, aber bis auf die Tatsache, dass man das Initialisieren nicht vergessen kann (und das kriegt man im Debugger eigentlich immer sehr schnell raus), bringen sie keine weiteren Sicherheiten, man kann ein Objekt löschen, egal ob eine Referenz darauf existiert oder nicht. Für sowas kann man sich smartpointer anschauen, aber meiner Meinung nach ist es immer gut, selber genau zu wissen, wann welches Objekt gelöscht wird; denn nur weil keine Zugriffsverletzung auftritt, heißt es noch lange nicht, dass ein Programm fehlerfrei weiter läuft.

Also: Wenn es geht, Referenzen benutzen, wenn es nicht geht, sind Pointer auch nicht wirklich schlimmer.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige