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

dev_null

Frischling

  • »dev_null« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Augsburg

Beruf: Application Developer

  • Private Nachricht senden

1

19.06.2007, 15:55

Verständnissproblem mit Zeiger

Hallo, ich habe ein Problem mit Zeigern.

Ein einfaches Programm, was ich verstehe:
Beispiel1

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// C++

//

#include <iostream>

using namespace std;

void Rechne (int *pPunkte, int Bonus);

// Hauptprogramm

//

int main ()
{
    // Variablen

    //

    int Punkte = 500;
    int Bonus = 300;



    Rechne (&Punkte, Bonus);

    cout << "Punkte: " << Punkte << endl;

}

void Rechne (int *pPunkte, int Bonus)
{
    *pPunkte += Bonus;

}


Nun zu meinem Programm was ich nicht ganz verstehe.
Beispiel2

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// C++

// Listing

//

#include <iostream>

using namespace std;

// Strukturen

//

struct S_Spieler
{
    int Energie;
    int Punkte;
    int xPosition;
    int yPosition;
    char Name[30];
};

// Prototypen

//

void NameAbfragen (S_Spieler *pSpieler);

// Hauptprogramm

//

int main ()
{
    // Variablen

    // 

    S_Spieler Spieler1;

    // Spieler initialisieren

    Spieler1.Energie = 1000;
    Spieler1.Punkte = 0;
    Spieler1.xPosition = 0;
    Spieler1.yPosition = 0;
    Spieler1.Name[0] = '\0';

    // Name des Spielers abfragen

    NameAbfragen (&Spieler1);
    cout << "Neuer Spieler: " << Spieler1.Name << endl;

    return 0;
}

// NameAbfragen

//

// Aufgabe: Name des Spielers abfragen

//

void NameAbfragen (S_Spieler *pSpieler)
{
    // Name abfragen

    cout << "Name des Spielers: ";
    cin.get (pSpieler->Name, 29);
} // NameAbfragen


Bei dem 2. Programm, wird eine Instanz "Spieler1" von der Struktur erstellt, soweit klar. Dann wird die Adresse der Struktur Spieler an eine Funktion übergeben, soweit auch klar. Was ich aber auf Teufel komm raus nicht verstehe ist: In der Funktion "NameAbfragen" wird etwas in pSpieler->Name geschrieben, jedoch ist pSpieler niegends deklariert, in meinem ersten beispiel heißt es ja auch *pPunkte warum heißt es also nicht *pSpieler?

Ich interpretiere das so:

Im Beispiel1 wir die lokale Variable Punkte direkt in der Funktion über die Adresse überschrieben.
Im Beispiel2 legt die Funktion was in den Stack, <last in first out> somit ist Spieler1.name "pSpieler" da das, dass letzte ist was in den Stack gekommen ist. Jedoch vermisse ich dennoch ein * da pSpieler nirgends deklariet ist. Wenn ich aber im Beispiel1 bei *pPunkte den stern weg nehme geibts einen error.

Ich weiß einfach nicht wo ich einen totalen Denkfehler habe.
Think free!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

19.06.2007, 16:07

Re: Verständnissproblem mit Zeiger

Zitat von »"dev_null"«

jedoch ist pSpieler niegends deklariert


doch, pSpieler ist eben jener zeiger auf die instanz der stuktur:

C-/C++-Quelltext

1
void NameAbfragen (S_Spieler *pSpieler) 


Zitat von »"dev_null"«

warum heißt es also nicht *pSpieler?


das liegt am -> ;)

C-/C++-Quelltext

1
pSpieler->Name;


ist das gleiche wie

C-/C++-Quelltext

1
(*pSpieler).Name;


der -> operator ist (in diesem fall) nur eine abkürzung für die obige schreibweise ;)

dev_null

Frischling

  • »dev_null« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Augsburg

Beruf: Application Developer

  • Private Nachricht senden

3

19.06.2007, 16:15

also wäre

C-/C++-Quelltext

1
cin.get ((*pSpieler).Name, 29);


auch richtig. Ist also nur eine andere Schreibweise...

Die denke ich mal in dem Thema Klassen noch behandelt wird ...

Gut, dann gehe ich mal davon aus das ich keinen Denkfehler habe xD
Think free!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.06.2007, 16:17

Zitat von »"dev_null"«

Gut, dann gehe ich mal davon aus das ich keinen Denkfehler habe xD


yep, ich denk du denkst richtig ;)

der -> operator dient grundsätzlich dazu, über einen zeiger auf ein objekt auf dessen member zuzugreifen (funzt also auch für funktionen etc. ganz gleich).

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

19.06.2007, 20:17

pSpieler existiert wirklich. Es ist einfach ein Zeiger. Der Speichert die Adresse, die du ihm übergibst. Deshalb kannst du auch beim zugriff auf die elemente nicht dem "." operator nehmen, sondern musst denn "->" operator nehmen.(Sonst kompilerfehler!)


Socke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

19.06.2007, 20:25

ich denk das hab ich oben schon geschrieben^^

Werbeanzeige