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

12.11.2014, 13:21

Zeiger

In Listing 9.1 (Einen Vektor erzeugen und verwenden)
wir in einerd for-Schleife die Adresse eines Zeiger +1 gerechnet.

Aber warum sollte man die Adresse manipulieren?!?

Hier das Listing:

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
#include<iostream>
#include<vector>
using namespace std;

int main()
{
    vector<int> vDaten(3);   // Vektor für Intiger
    vector<int>::iterator i; // Iterator

    //grösse des Vektors anzeigen
    cout<<"Aktuelle Zahl an Eintraegen: ";
    cout<<static_cast<int> (vDaten.size() )<<endl;

    //Daten in den Vektor schreiben
    vDaten[0] = 150;
    vDaten[1] = 200;
    vDaten[2] = 220;

    //Inhalt des Vektors anzeigen
    cout<<"Inhalt des Vektors: "<<endl;
    for (i=vDaten.begin();i<vDaten.end();i++)
    {
        cout<<(*i)<<endl;
    }

    return 0;
}


Laut Buch spricht man mit den * den Inhalt (bzw.) die
Variabele an.

Aber warum wird hier mit einer Adresse im Speicher die for-Schleife gesteuert???

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

12.11.2014, 13:25

i ist kein Zeiger, i ist ein Iterator der immer um eins weitergeschoben wird.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

12.11.2014, 16:07

Wenn es ein Zeiger wäre, der Sinn die Adresse dieses um 1 zu erhöhen, ist wie hier das durchlaufen eines Arrays.

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

4

13.11.2014, 08:30

Also ein Iterator ist ein Zeiger zunächst einmal.
Hier mal die Beschreibung: http://www.cplusplus.com/reference/iterator/
Darum muß man einen iterator ja schließlich dereferenzieren um an den eigentlichen Wert zu kommen.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

5

13.11.2014, 09:13

Ist nicht ganz korrekt. Ein Zeiger ist ein Iterator, aber ein Iterator muss nicht unbedingt ein Zeiger sein. Steht sogar in deinem Link

Zitat

The most obvious form of iterator is a pointer: A pointer can point to elements in an array, and can iterate through them using the increment operator (++).
Ein Iterator kann noch wesentlich mehr, je nachdem, zu welcher Datenstruktur er gehört.

Um mal auf die Frage und die ersten Antworten zurückzukommen. i++ (wenn i ein Iterator ist), inkrementiert diesen. Das heißt nicht, dass auf ihn eine 1 addiert wird. Stattdessen ist der Inkrementierungsoperator für den Iterator überladen. Je nach Datenstruktur macht er etwas anderes (z.B. ist die Inkrementierung eines std::list Iterators etwas ganz anderes als die eines std::vector Iterators).

Außerdem wird bei Zeigern auch nicht "die Adresse um 1 erhöht". Das hängt von der Größe des mit dem Zeiger verknüpften Datentyps ab. Bei einem int-Zeiger (int hat eine Größe von 2 Byte), erhöht sich die referenzierte Adresse um 2, bei einem long* um 4, bei einem char* um 1.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

13.11.2014, 10:12

Ein int hat doch auf den meisten Plattformen dieselbe Größe wie ein long int, oder lieg ich da falsch?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

13.11.2014, 10:30

Ein int hat doch auf den meisten Plattformen dieselbe Größe wie ein long int, oder lieg ich da falsch?

Da liegst du falsch ;)

http://en.wikipedia.org/wiki/64-bit_comp…bit_data_models

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

13.11.2014, 12:34

Man lernt nie aus. :D
edit: Ups, was missverstanden... :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

13.11.2014, 16:48

Wenn es ein Zeiger wäre, der Sinn die Adresse dieses um 1 zu erhöhen, ist wie hier das durchlaufen eines Arrays.
Das ist falsch. Die Adresse wird um die size des Objekts erhoeht, auf die der Zeiger zeigt.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

13.11.2014, 19:58

Stimmt, mein Fehler. Natürlich um size.

Werbeanzeige