Forum: PC-Programmierung zeiger mit new


von RC123 (Gast)


Lesenswert?

Hallo Zusammen,
kurze Verstaendnisfrage.

Damit ein Zeiger auf eine bestimmte Adresse zeigt schreibt man das mit 
dem adressoperator

pZeiger = &variable

Wenn man new verwendet, braucht man adressoperator ja nicht, weil new 
die Adresse einer Klasse oder variable zurueck gibt oder?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ja.

von RC123 (Gast)


Lesenswert?

Das Problem ist, dass es ziemlich verwirrend alles ist. Habe hier als 
Beispiel eine Funktion, die einfach eine Liste bzw. den Inhalt davon 
ausgeben soll.

Dazu verwende ich den Iterator i. Da es sich hierbei um Zeiger auf 
Objekte der Liste handelt, wird der Operator "*" verwendet.

Was ich jetzt aber nicht verstehe ist, warum ich nicht mit "cout << i ;" 
direkt die Adresse ansprechen kann. Bei Variablen ist es auch nicht 
anders. Erst kommt die Zeigerdeklaration, dann wird die Adresse einer 
bestimmten int-Variablen dem Zeiger zugewiesen und mittels "cout << 
pZeiger; wird direkt die Adresse ausgegeben.

Oder fungiert im Falle von listen der Iterator i direkt als Variable? 
Denn mittels "cout << &i;" bekomme ich die Adresse, kenne ich aber auch 
nur von Variablen, nicht von Zeigern ...



void ZeigeListe (list<int> lListe)
{
  list<int>::iterator i;    // Iterator

  cout << "Anzahl der Elemente in der Liste: ";
  cout << static_cast<int> (lListe.size()) << endl;

  cout << "Inhalt der Liste: ";
  if (lListe.empty()==false)
  {
    for (i=lListe.begin(); i!=lListe.end(); i++)  // Iterator wird wie 
eine Zählvariable verwendet
      cout << *i << ", ";                // In der Liste werden keine 
Objekte, sondern Zeiger auf Objekte gespeichert.
                            // Deshalb i deferenzieren, damit wir auf 
das eigentliche Objekt zugegriffen werden kann
  }
  else
    cout << "Liste ist leer";

  cout << endl << endl;
} // ZeigeListe

von Yalu X. (yalu) (Moderator)


Lesenswert?

RC123 schrieb:
> Dazu verwende ich den Iterator i. Da es sich hierbei um Zeiger auf
> Objekte der Liste handelt, wird der Operator "*" verwendet.

Ein Iterator ist kein Zeiger, sondern ein Objekt. Um den Iterator
derefenzieren zu können, wird der "*"-Operator in der STL geeignet
überladen.

> Was ich jetzt aber nicht verstehe ist, warum ich nicht mit "cout << i ;"
> direkt die Adresse ansprechen kann.

Ein Objekt kann nur dann per "cout <<" ausgegeben werden, wenn eine
entsprechende Überladung des "<<"-Operators existiert. Die gibt es aber
für Iteratoren nicht. Es steht dir natürlich frei, selber eine passende
Überladung zu schreiben.

Einen Zeiger auf das entsprechende Objekt bekommst du mit
1
zeiger = &*iterator

Das sieht unsinnig aus, weil man von C gewohnt ist, dass sich & und *
gegenseitig aufheben. In C++ ist das wegen der Überladungsmöglichkeit
aber nicht immer der Fall.

von RC123 (Gast)


Lesenswert?

Ok danke, werde mir das weiterhin anschauen. Nach 2 Stunden kann man 
noch nicht viel verstehen, denke mal, dass das mit der Zeit kommt.

Werde erst einmal das Buch 1x durcharbeiten und dann ein eigenes Projekt 
erstellen, wo ich auf die unterschiedlichen Kapitel noch mal genau drauf 
eingehen werde.

von Rolf M. (rmagnus)


Lesenswert?

RC123 schrieb:
> Ok danke, werde mir das weiterhin anschauen. Nach 2 Stunden kann man
> noch nicht viel verstehen, denke mal, dass das mit der Zeit kommt.

Ja, nach ein paar Jahren gibt sich das. ;-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> RC123 schrieb:
>> Ok danke, werde mir das weiterhin anschauen. Nach 2 Stunden kann man
>> noch nicht viel verstehen, denke mal, dass das mit der Zeit kommt.
>
> Ja, nach ein paar Jahren gibt sich das. ;-)

21 Tage sind völlig ausreichend: 
http://www.geek.com/articles/chips/learn-to-program-three-weeks-20100312/ 
;-P

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.