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

1

11.04.2010, 20:31

Zeiger in C++

Also ich bin grad dabei C++ zu lernen und ich versteh nicht wozu ich Zeiger brauch(brauchen werde).Wenn ich in nen paar jahren 2d Spiele mach, werde ich die dann brauchen? Weil ich versteh zwar schon, wie die funktionieren, aber wozu?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

11.04.2010, 20:36

Also jetzt praktisch gesehen liegt z.B. ein Vorteil bei der Datenübergabe. Heißt, du willst einer Funktion die Daten eines Spielers übergeben, du könntest das ganze mit ganz normalen Parametern machen, die Daten kopieren und dann in der Funktion verwenden und dann später diese Daten als Wert zurückgeben....

Aber was, wenn deine Spielerklasse extrem groß ist? Du musst dann soviele unnötige Daten mitliefern, dabei reicht es doch, zu sagen, wo die Daten des Spielers zu finden sind (ein Zeiger auf die Adresse), damit die Funktion damit umgehen kann!
WIP Website: kevinheese.de

3

11.04.2010, 20:39

Außerdem kannst du dynamisch Speicher allokiieren. Wenn du z.B. ein Array in einer Klasse hast, dann musst du in der Deklaration die Größe angeben. Mit einem Pointer und new kannst du jederzeit variabel die Größe angeben und sogar ändern. (delete)
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

4

11.04.2010, 20:44

danke ich habs jetzt geblickt

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

11.04.2010, 21:37

es gibt noch einen verwendungszweck. du kannst einer funktion oder klasse einen zeiger übergeben damit dieser den bereich nicht nur ausliest sondern auch ändert.
das ist praktisch wenn du zum beispiel einen zeiger auf deinen screen hast und viele klassen die darauf zeichnen sollen.
mit screen mein nicht deinen monitor sondern der speicherbereich in dem steht was im nächsten frame angezeigt wird.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

6

11.04.2010, 22:03

Es gibt etliche Anwendungsbereiche für Zeiger. Grundsätzlich geht es darum, auf einen Speicherbereich (oder Null) zu verweisen, um so eine Indirektion zu erzeugen.

Also ja, man muss das Konzept der Zeiger in C++ verstanden haben. Eine gute Einführung findet man zum Beispiel hier.

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

7

11.04.2010, 23:11

Also jetzt praktisch gesehen liegt z.B. ein Vorteil bei der Datenübergabe. Heißt, du willst einer Funktion die Daten eines Spielers übergeben, du könntest das ganze mit ganz normalen Parametern machen, die Daten kopieren und dann in der Funktion verwenden und dann später diese Daten als Wert zurückgeben....

Aber was, wenn deine Spielerklasse extrem groß ist? Du musst dann soviele unnötige Daten mitliefern, dabei reicht es doch, zu sagen, wo die Daten des Spielers zu finden sind (ein Zeiger auf die Adresse), damit die Funktion damit umgehen kann!
Könnte man so fast in einem Buch abdrucken finde ich :-).

Ein weiterer Anwendungsfall neben der Übergabe von Daten an Funktionen oder ähnlichem ist der, dass du abhängig von bestimmten Bedingungen mit einem oder keinem bestimmten Objekt arbeiten willst, könnte zum Beispiel so aussehen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AnObject Men[2000],
Women[2000];

void KillSomeOneOrNone()
{
   int randomvalue = random(2); // zufallswert von 0-2, bei 0 wird ein mann selektiert, bei 1 eine frau, bei 2 nichts
   AnObject* target = randomvalue==0 ? &Men[0] : randomvalue==1 ? &Women[0] : NULL;
   if( target )
   {
    double distance = vPosition.Distance(target->vPosition);
    if( TargetInRange(distance) )
    {
        Kill(Target);
    }
   }
 }


Dummes Beispiel, aber ich denke man versteht, was gemeint ist ;-).

LG
Alyx

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

8

12.04.2010, 16:58

du könntest das ganze mit ganz normalen Parametern machen, die Daten kopieren

Ein weiterer Anwendungsfall neben der Übergabe von Daten an Funktionen oder ähnlichem ist der, dass du abhängig von bestimmten Bedingungen mit einem oder keinem bestimmten Objekt arbeiten willst, könnte zum Beispiel so aussehen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AnObject Men[2000],
Women[2000];

void KillSomeOneOrNone()
{
   int randomvalue = random(2); // zufallswert von 0-2, bei 0 wird ein mann selektiert, bei 1 eine frau, bei 2 nichts
   AnObject* target = randomvalue==0 ? &Men[0] : randomvalue==1 ? &Women[0] : NULL;
   if( target )
   {
  double distance = vPosition.Distance(target->vPosition);
  if( TargetInRange(distance) )
  {
     Kill(Target);
  }
   }
 }


Dummes Beispiel, aber ich denke man versteht, was gemeint ist ;-).

LG
Alyx
Das sind doch eigentlich schon Anti-Pattern für Pointer.
Denn in deinem Anwendungsfall(Funktions-Parameter) ist nicht ersichtlich, warum keine Referenzen ausreichen.

@Matze Deswegen mach dir den Unterschied zwischen Pointern und Referenzen klar und benutze, wenn es geht const-Referenzen bei Funktionsparametern.

Das Beispiel von Alyx ist typische Praxis. Doch leider sehr schlechter Code. Sowas sollte man sich auf keinen Fall angewöhnen.
Außerdem führ das Überprüfen auf NULL-Pointer stillschweigend einen zusätzlichen Objekt-Zustand ein, nämlich "nicht-initialisiert". Das erspart man sich mit Referenzen.

9

12.04.2010, 18:19

Was ich noch viel schlimmer als Dangling Pointers finde, sind sinnlose Zuweisungen und Prüfungen auf Null. Sieht man leider immer wieder, unter dem Argument der "Sicherheit".

Ich habe schon oft solchen Code gesehen:

C-/C++-Quelltext

1
2
3
4
5
MyClass::~MyClass 
{ 
    delete obj; 
    obj = NULL; 
}

C-/C++-Quelltext

1
2
T* a = NULL; 
a = &b;

Und ganz schrecklich:

C-/C++-Quelltext

1
#define SAFE_DELETE(ptr) delete ptr; ptr = NULL;

Mischu

Frischling

Beiträge: 21

Wohnort: Olten (Schweiz)

Beruf: Javaentwickler (swissinfo.ch)

  • Private Nachricht senden

10

12.04.2010, 18:56

Es gibt ja die beiden Konzepte ”call by reference“ und ”call by value“. Wobei hier Pointer das 1. Konzept darstellen. Ein aus meiner Sicht sehr wichtiger Einsatzfall ist, wenn man den Wert von mehr als einer Variable ändert will, welche außerhalb einer Funktion / Methode deklariert sind. Mit call by value hat man lediglich den return wert als Übergabe.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mischu« (12.04.2010, 19:13)


Werbeanzeige