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

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

11

09.02.2008, 14:14

Zitat von »"Nelrim"«


kann mir das nicht mal jemand für doofe erklären?

Ne sorry, Pointer sind nix für doofe ;)

Für alle anderen: es war mir am Anfang auch bisschen schleierhaft, wie das alles zusammenhängt, aber man muss immer den Unterschied von deklaration und Nutzung im Kopf behalten.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int *pint = 0; // * legt fest, dass pint ein Pointer ist

pint = new int(2); // da pint ein Pointer ist greift man ohne * oder & darauf zu

*pint = 5; // hier wird der Pointer per * dereferenziert und man greift auf die Variable zu

int **ppint = &pint; // im ersten Teil wird per ** festgelegt, dass ppint ein Pointer auf einen Pointer auf int ist, im 2. Teil wird per & auf die Adresse vom Pointer auf int zugegriffen

if (**ppint == *pint && *ppint == pint && ppint == &pint)
  return 0; // alles ist so wie es sein soll

else
  return -1; // das hier würde bedeuten, dass aus irgendeinem Grund die Zusammenhänge zwischen den verschiedenen Zugriffsebenen zerstört wurden

Bei einer Definition von einen Pointer [auf einen Pointer [auf einen Pointer...]] sollte man jedes * als eine weitere Adressebene verstehen. Das ist vor allem im Zusammenhang mit const wichtig.
(Bitte meinen Wulst an c und p nicht im Sinne der Ungarischen Notation verstehen :D ich hab stattdessen einfach die Deklaration rückwärts aufgeschlüsselt (wobei der Typ an 1. Stelle der Deklaration steht))

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int i = 2;

const int ci = 4; // der Wert 4 ist konstant


int const ci2 = 5; // das selbe in grün, es ist egal, ob const vor oder nach dem int kommt


int *pi = &i; // einfacher Pointer auf i


int * const cpi = &i; // konstanter Pointer auf nicht konstantes i


int *pi2= &ci; // FEHLER, ci ist konstant!


int const *pci = &ci; // so ist richtig, das int ist konstant, der Pointer kann aber auch auf ein anderes Element zeigen


int const * const cpci = &ci2; // Auch richtig, jetzt sind sowohl der Integer als auch der Pointer const


int const ** const cppci = &ci; // konstanter Pointer auf nicht konstanten Pointer auf konstanten Integer


int * const * const cpcpi = cpi; // konstanter Pointer auf konstanten Pointer auf nicht konstanten Integer


Is jetzt sicher bissl Brainfuckmäßig, aber so siehts halt aus :D

Nelrim

Frischling

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

12

09.02.2008, 14:34

hmm danke erstmal für den Erklärungsversuch...

aber was hat das mit Listing 6.5 zu tun?

mich stört da halt das die Deklartion im Funktionsprototyp versteckt zu sein scheint (wüsste nicht was sonst den pointer da deklarieren könnte) und das die ach so wichtige initialisierung gänzlich fehlt.

ausserdem habe ich den unterschied zwischen *pPointer = &Pointer und pPointer = &Pointer wohl noch nicht kapiert.

sorry

Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

13

09.02.2008, 16:21

also wenn pPointer ein Pointer auf einen Pointer sein soll und Pointer einfach ein Pointer dann ist der Unterschied folgender:

C-/C++-Quelltext

1
2
*pPointer = &Pointer; // FEHLER, Konvertierung von Type** (&Pointer) in Type* (*pPointer) nicht zulässig

pPointer = &Pointer; // so geht es -> passieren tut: Type** = Type**


Bei Funktionsparametern kannste dir das erstma so vorstellen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void fn(int *pint);

int main()
{
  int i=0;

  fn(&i); // fn(int *pint(&i)) also Initialisierung von pint mit der Adresse von i

    // wie das intern genau abläuft is dann wieder was anderes, da kann ich jetzt auch nicht allzu viel zu sagen und es ist für den Anfang mit C++ auch nicht so wichtig


  return 0;
}

Nelrim

Frischling

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

14

09.02.2008, 16:43

ah ich glaube so langsam dämmerts!

bedeutet:

C-/C++-Quelltext

1
fn(int *pint(&i)) 


das gleiche wie:

C-/C++-Quelltext

1
fn (int *pint = &i)

:?:
Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

15

09.02.2008, 16:55

Meines erachtens macht das nicht so viel Sinn. Was hast du den damit vor?

16

09.02.2008, 17:02

Denke schon.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

17

09.02.2008, 17:05

Zitat von »"Nelrim"«

ah ich glaube so langsam dämmerts!

bedeutet:

C-/C++-Quelltext

1
fn(int *pint(&i)) 


das gleiche wie:

C-/C++-Quelltext

1
fn (int *pint = &i)

:?:
Nelrim


Naja, bei Pointern auf int ist das das gleiche, nur wenn du mal zu Klassen und expliziten Konstruktoren kommen solltest dann ist es ein Unterschied :)

Werbeanzeige