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

id62

Frischling

  • »id62« ist der Autor dieses Themas

Beiträge: 4

Wohnort: try to find me

  • Private Nachricht senden

1

01.01.2006, 22:47

Zeiger - Verständnisproblem

Hallo,

ich habe irgendwie das Zeigerkapitel nicht richtig Verstanden oder irgendwas immer wieder beim Lesen übersehen.

mit * vor dem Variablennamen

C-/C++-Quelltext

1
*pName
erzeuge ich über die Direktaddressierung eine Variable

In dem Beispiel aus 7.8

C-/C++-Quelltext

1
2
3
4
5
6
7
CRaumschiff *pGegner = NULL;

pSpieler = new CRaumschiff;
pGegner =  new CRaumschiff(x,y);

delete pSpieler;
pSpieler = NULL;



wird oben zuerst mit * die Adresse für die Variable pGegner über die Direktadressierung neu uns sicher auf NULL gesetzt. Unten bei pSpieler auch wieder.

Nur verstehe ich nich, warum hier beim letzten NULL nicht mit * gearbeitet wird. Sie soll doch sicher wieder zurückgesetzt werden oder?


Oder habe ich hier etwas ganz falsch verstanden?
MfG,

id62

Mein Motto 2006:
ALLES - WIRD - BESSER --> den WIR sind DEUTSCHLAND

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

01.01.2006, 22:57

Re: Zeiger - Verständnisproblem

Mit CRaumschiff *pGegner wird eine neue Variable (und zwar ein Zeiger) pGegner erstellt, dem dann NULL zugewiesen wird. Es ist etwas übersichtlicher wenn du schreibst

C-/C++-Quelltext

1
CRaumschiff* pGegner = NULL;

oder auch

C-/C++-Quelltext

1
2
CRaumschiff *pGegner;
pGegner = NULL;

id62

Frischling

  • »id62« ist der Autor dieses Themas

Beiträge: 4

Wohnort: try to find me

  • Private Nachricht senden

3

01.01.2006, 23:08

das ist das so zu verstehen, durch das * Zeichen wird Einmalig diese Variable als Zeiger definiert?

Und ab dann brauch es nicht mehr verwendet zu werden, weil es in der Variable bekannt ist?


Warum wird dann in einer anderen Funktion:

C-/C++-Quelltext

1
2
3
4
void BerechnePunkte (int *pPunkte, int Bonus)
{
*pPunkte += Bonus;
}


mit *doppelt verwendet, wenn diese doch oben schon initialisiert ist als INTEGEGER
MfG,

id62

Mein Motto 2006:
ALLES - WIRD - BESSER --> den WIR sind DEUTSCHLAND

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

4

01.01.2006, 23:10

genau, aber wenn du einen zeiger von einer klasse hast, greifst du mit einem -> auf die memberfunktionen zu, wo du sonst (ohne zeiger) . schreiben würdest. Also pGegner->Init() anstelle von Gegner.Init()

edit: (koschka war schneller aber egal 8] )
Manchmal willst du aber auch zB eine Funktion benutzen, die einen Parameter vom Typ CRaumschiff erwartet, obwohl du nur einen Pointer hast. Dann schreibst du einfach funktion(*pGegner), dann wird nicht der Zeiger sondern die richtige Variable übergeben. Es kommt auch vor das du eine Funktion benutzen willst, die einen Zeiger auf das Raumschiff erwartet anstelle des Raumschiffs selber (weil das schneller geht), du hast aber nur eine Variable vom Typ CRaumschiff. Dann kannst du einfach die Adresse des Raumschiffs übergeben (denn genau das ist ja was in einem Zeiger steht): funktion(&Gegner)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

01.01.2006, 23:10

Ein Datenobjekt mit einem Stern (*) ist ein Zeiger. Also eigentlich nur eine Adresse auf einen Speicherbereich. Man kann sich das eigentlich ganz einfach wie eine Verknüpfung vorstellen.

Um eine Adresse eines Datenobjektes zu bekommen benutzt du den (& Operator).
z.B.

C-/C++-Quelltext

1
2
3
int a = 123;
int *pa = &a;
*pa = 234;


pa besitzt jetzt die Adressse von a. Wenn man *pa manipuliert, manipuliert man auch a.
Also würde eine Ausgabe von *pa und a das selbe ausgeben, also ist der Wert 234. Pa besitzt einen EIGENEN SPEICHERBEREICH, der die Adresse von a enthällt. Um mit Zeigern deren Werte zu ändern muss man sie derefernezieren (* Operator) (*pa=x)

Wozu das ganze?
Man kann so sehr veil Kopierarbeit dem Computer ersparen. Nehmen wir mal keine Zahlen sondern irgendwelche Texturen oder noch größere Objekte. So muss der Computer lediglich den Speicheradresse kopieren, der Aufwand ist immer gleich, egal welches Objekt.

@Spike:
a->b() == (*a).b() !!!!!
Ich weiss aber was du damit sagen willst. Der -> Operator derefernziert einen Zeiger (*a) und greift auf das "Strukturellement" b zu. (keine Parmeter) dann: a->b();

Werbeanzeige