Zeiger



  • Hallo,

    könnt ihr mir verraten warum an der im Quellcode markierten Stelle 0 ausgegeben wird?

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int arr[10] = {8, 6, 1, 2, 3, 5, 10, 17}, *parr;
    
        parr = arr;
    
        cout << *(parr + 3) << endl;       // 2
        cout << *parr + 5 << endl;         // 13
        parr++;
        cout << *parr << endl;             // 6
        parr += 4;                         
        cout << *parr << endl;             // 5
        cout << parr[4] << endl;           // 0 (warum wird hier 0 ausgegeben?)
    
        char dummy;
        cin >> dummy;
        return 0;
    }
    


  • Du hast ganz einfach nur 8 Elemente initialisiert! Du zeigst mit parr aber auf das 10. Element. Also noch zwei weitere Zahlen dazu, dann gehts.

    Nebenbei : Du kannst auch die Anzahl der Elemente weglassen

    int arr[] = {8, 6, 1, 2, 3, 5, 10, 17};
    

    Sersn,

    Nalas



  • genau du musst beachten ,
    das parr nach parr++ und parr += 4 nicht mehr auf das erste element im array
    weisst und du dann durch parr[4] quasi auf das 10. element zugreifst,
    da das aber nicht definiert ist bekommst du hier auch ein undefiniertes
    ergebnis.



  • es ist nicht undefiniert:

    nach den inkrements gilt ja

    parr == arr[5]
    

    und daher

    parr[4] == arr[9]
    

    und da arr die Länge 10 hat, ist arr[9] durchaus definiert und ein int.
    Allerdings werden bei der Initialisierung mit einer zu kurzen Liste die verbleibenden Variablen mit 0 intitialisiert. Deswegen hat das den gleichen Effekt, als häätest du folgendes gesagt:

    int arr[10] = {8, 6, 1, 2, 3, 5, 10, 17, 0, 0}; //die nullen sind optional!
    

Anmelden zum Antworten