Wie versteht man Zeigerarithmetik??



  • Du darfst aber nicht auf Zahl[5] zugreifen wenn dein verdammtes Array nur 5 Elemente hat. Himmel!

    for(int i=0; i<5; i++)
        {
            cout << "Zahl[" << i <<"]: ";
            cin  >> a;
        }
    

    So ein Schwachsinn. Glaubst Du echt, somit kannst Du das Array mit Werten füllen?

    Such Dir ein anderes Hobby, das tut ja schon beim Zuschauen weh.



  • silent_max schrieb:

    also somit 5 und somit Zahl[5].

    Ich dachte du hast nur Zahl[0] bis Zahl[4], zumindest hast du das geschrieben. 😕



  • qweasdyxc schrieb:

    das tut ja schon beim Zuschauen weh.

    Wie würdest es denn Du machen??

    Gruß



  • silent_max schrieb:

    Belli schrieb:

    Lies Dir das noch mal ganz genau durch, vor allen Dingen:

    silent_max schrieb:

    ..

    Wenn ich

    int Zahl[5];
    

    deklariere bzw. initialisere, dann habe ich doch Elemente von Zahl[0] bis Zahl[4], also somit 5 und somit Zahl[5].

    Muss es so heißen:

    int Zahl [4];
    

    ??

    Na komm, lesen kannst Du doch ... das fettgedruckte, bist Du nicht der Meinung, dass sich das widerspricht?



  • @Belli: Da liegt ein Missverständnis vor, weil sich silent_max etwas undeutlich ausgedrückt hat.

    @silent_max: Wenn du ein Array mit 5 Elementen deklarieren willst, schreibst du natürlich

    int array[5];
    

    Und nachher kannst du zugreifen auf array[0] , array[1] , array[2] , array[3] und array[4] .

    Wir kritisieren aber diese Zeile:

    int *pZahl = &Zahl[5];
    

    Hier meinst du vermutlich das:

    int *pZahl = &Zahl;
    


  • noehoe schrieb:

    int *pZahl = &Zahl;
    

    Eher nicht, das macht nämlich genauso wenig Sinn.



  • noehoe schrieb:

    Hier meinst du vermutlich das:

    int *pZahl = &Zahl;
    

    Wenn ich das so schreibe, also

    int *pZahl = &Zahl;
    

    dann wird mir bei meinem Compiler der Adressoperator rot unterringelt mit der Meldung

    Error: Ein Wert vom Typ ""int (*)[5]"" kann nicht zum Initialisieren einer Entität vom Typ ""int *"" verwendet werden.
    

    Also frei erfunden habe ich diese Meldung nicht.

    Vielleicht liegt das an meinem Compiler... Ich nutz Microsoft Visual Studio 2010 Ultimate.

    Edit:

    Wenn ich jedoch

    int *pZahl = &Zahl[5];
    

    eingebe, ist alles ok.



  • silent_max schrieb:

    Wenn ich jedoch

    int *pZahl = &Zahl[5];
    

    eingebe, ist alles ok.

    Da mit pZahl aber überhaupt nix gemacht wird, könnte man diese Deklaration/Definition ebensogut einfach weglassen!



  • cooky451 schrieb:

    Geh mal durch dein Programm und kommentiere jede Zeile mit dem was sie macht, und wozu sie im Programm steht. (Also jede Zeile in der sich Code befindet. Kein { oder }.)



  • Belli schrieb:

    Da mit pZahl aber überhaupt nix gemacht wird, könnte man diese Deklaration/Definition ebensogut einfach weglassen!

    Ich kann mich jetzt wahrscheinlich täuschen ... aber geht das nicht Richtung Referenzen?

    Edit:

    Denn wenn ich die Zeile

    int *pZahl = &Zahl[5];
    

    weglasse, funktioniert es auch.



  • cooky451 schrieb:

    Geh mal durch dein Programm und kommentiere jede Zeile mit dem was sie macht, und wozu sie im Programm steht. (Also jede Zeile in der sich Code befindet. Kein { oder }.)

    Versuch das doch mal, max.



  • qweasdyxc schrieb:

    Du darfst aber nicht auf Zahl[5] zugreifen wenn dein verdammtes Array nur 5 Elemente hat. Himmel!

    So offtopmäßig: Warum müssen die Zählindizes mit 0 anfangen? Ich meine hat es einen bestimmten Grund oder eine Notwendigkeit?



  • Nein, sie könnten auch mit 17 anfangen. Tun sie aber einfach nicht.



  • #include<iostream>
    using namespace std;
    
    int main()
    {
        cout << "\t 5 Adressen um jeweils 4 Byte hochzaehlen lassen.\n";
        cout << "\n";
    
        int Zahl[5]; //Array mit 5 Elementen initialisieren
        int *pZahl = &Zahl[5]; //Pointer auf das Array initialisieren
        int a; // Variable deklarieren
    
        cout << "Geben Sie fuenf Zahlen ein.\n";
    
        for(int i=0; i<5; i++)
        {
            cout << "Zahl[" << i <<"]: "; //Für Elemente von 0 bis 4 Werte bzw. Zahlen eingeben
            cin  >> a; //Variable a fuer die Werteeingabe
        }
    
        cout << "Die Adresse der jeweiligen Zahl lautet wie folgt:\n";
    
        for(int i=0; i<5; i++)
        {
            cout << "Zahl[" << i << "]: " << &Zahl[i] << "\n"; // Adresse fuer die Elemente 0 bis 4 ausgeben
        }
    
        return 0;
    }
    

    Ich hoffe, dass es jetzt bisschen verständlicher wird??



  • silent_max schrieb:

    Ich hoffe, dass es jetzt bisschen verständlicher wird??

    Häh? Der einzige, der hier irgendwas nicht versteht, bist Du!



  • Belli schrieb:

    Nein, sie könnten auch mit 17 anfangen. Tun sie aber einfach nicht.

    Ja entschuldige wenn ich es missverständlich ausgedrücklt habe: Wieso werden in einem Vektor/Array bei C/C++ die Element von 0 bis n-1 nummeriert und nicht von 1 bis n?



  • silent_max schrieb:

    #include<iostream>
    using namespace std;
     
    int main()
    {
        cout << "\t 5 Adressen um jeweils 4 Byte hochzaehlen lassen.\n";
        cout << "\n";
     
        int Zahl[5]; //Array mit 5 Elementen DEFINIEREN, NICHT INITIALISIEREN
        int *pZahl = &Zahl[5]; //Pointer auf das Array initialisieren DER POINTER ZEIGT HINTER DAS ARRAY UND WIRD NIE GEBRAUCHT
        int a; // Variable deklarieren UND DEFINIEREN, WIRD ABER NIE WIRKLICH GEBRAUCHT
     
        cout << "Geben Sie fuenf Zahlen ein.\n";
     
        for(int i=0; i<5; i++)
        {
            cout << "Zahl[" << i <<"]: "; //Für Elemente von 0 bis 4 Werte bzw. Zahlen eingeben
            cin  >> a; //Variable a fuer die Werteeingabe A WIRD NICHT WEITER VERARBEITET, WOZU ALSO?
        }
     
        cout << "Die Adresse der jeweiligen Zahl lautet wie folgt:\n";
     
        for(int i=0; i<5; i++)
        {
            cout << "Zahl[" << i << "]: " << &Zahl[i] << "\n"; // Adresse fuer die Elemente 0 bis 4 ausgeben
        }
     
        return 0;
    }
    

    Ich hoffe, dass es jetzt bisschen verständlicher wird??



  • Namal schrieb:

    Belli schrieb:

    Nein, sie könnten auch mit 17 anfangen. Tun sie aber einfach nicht.

    Ja entschuldige wenn ich es missverständlich ausgedrücklt habe: Wieso werden in einem Vektor/Array bei C/C++ die Element von 0 bis n-1 nummeriert und nicht von 1 bis n?

    Keine Ahnung, aber warum nicht von 17 bis 17 + n - 1?
    Vielleicht gewachsen aus der Maschinensprache ... weil man dort soviel ich weiß, mit Offsets rechnet/gerechnet hat.
    Letztendlich ist es aber doch egal.



  • Belli schrieb:

    silent_max schrieb:

    [cpp]

    [...]

    int *pZahl = &Zahl[5]; //Pointer auf das Array initialisieren DER POINTER ZEIGT HINTER DAS ARRAY UND WIRD NIE GEBRAUCHT

    [...]

    Ich hoffe, dass es jetzt bisschen verständlicher wird??

    Ein Pointer AUF das Array wäre übrigens:

    int *pZahl = Zahl;
    

    oder von mir aus auch:

    int *pZahl = &Zahl[0];
    


  • Namal schrieb:

    qweasdyxc schrieb:

    Du darfst aber nicht auf Zahl[5] zugreifen wenn dein verdammtes Array nur 5 Elemente hat. Himmel!

    So offtopmäßig: Warum müssen die Zählindizes mit 0 anfangen? Ich meine hat es einen bestimmten Grund oder eine Notwendigkeit?

    Informatiker mögen halt die 0. :p Wenn etwas nicht bei 0 beginnt, bin ich verwirrt. Außerdem bezeichnet der Index ja den Offset. Wenn es kein Offset gibt (0), landest du am Anfang. Darum finde ich es auch logisch, dass es bei 0 beginnt. Im Übrigen kannst du auch den Variablennamen als Offset hernehmen, also kannst statt Zahl[0] auch 0[Zahl] schreiben.


Anmelden zum Antworten