2016-04-04 11 views
1
erwartet

Warum ist es, dass mein Zeigerwert ändert sich nicht, wenn ich es an die Konsole mit dieser Methode zu drucken:cout Zeiger auf Array-Element wird anderen Wert Ausdrucken als

int main() 
{ 
    int array[] = {1, 2, 3, 4, 5}; 
    int *p = array; 
    p++; 
    *p = 100; 
    for (int i = 0; i < 5; i++) 
    { 
     cout << *array + i << ", "; 
    } 
    return 0; 
} 

, wenn ich das an den Druck Konsole bekomme ich 1, 2, 3, 4, 5. Worauf zeigt der Zeiger in diesem Fall? In diesem Beispiel sollte array[1] den Wert 100 haben, aber es ändert sich nicht.

Ich weiß auch, dass, wenn ich das Array bei 5 zum Beispiel starten, der Zähler nur in der Reihenfolge von 5 drucken wird. Was passiert hinter den Kulissen, um dies zu bewirken?

Antwort

3

*array wird zum ersten Element des Arrays aufgelöst. *array + i fügt diesem Element i hinzu, da es aufgrund der Operatorpriorität als (*array) + i geparst wird. So Ihre Schleife druckt 1 + 0, 1 + 1 usw.

Wenn Sie die Elemente des Arrays drucken möchten, können Sie dies tun:

for (auto e : array) cout << e << ", "; 

Wenn Sie Zeigerarithmetik explizit verwendet werden soll, wird das Sie haben Klammern an den richtigen Stellen zu verwenden:

for (int i = 0; i < 5; i++) 
    cout << *(array + i) << ", "; 
+0

Nur eine kleine Anmerkung ... keine Notwendigkeit, jedes Element zu kopieren: für (const Auto & e: Array) cout << e << ""; –

+1

@ A.Fagrell In diesem Fall sind sie Ints, so dass es fraglich ist, ob die Verwendung von Referenzen hilft. – juanchopanza

0

Versuchen

cout << *(array + i) << ", "; 
1

Sie drucken array[0] + i, d. H. 1 + i für i in [0, 5]. Kein Weg ist binär + Betreiber höher precedence als unär *. Verwenden Sie Klammern, um + den richtigen Ausdruck zu bilden:

*(array + i) // or array[i]