Zeigerarithmetik und Arrays: Was ist wirklich legal?

Betrachten Sie die folgenden Aussagen:

int    *pFarr, *pVarr;

int    farr[3] = {11,22,33};
int    varr[3] = {7,8,9};

pFarr = &(farr[0]);
pVarr = varr;

Zu diesem Zeitpunkt zeigen beide Zeiger auf den Anfang der jeweiligen Array-Adresse. Für * pFarr betrachten wir derzeit 11 und für * pVarr, 7.

Ebenso, wenn ich den Inhalt jedes Arrays über * farr und * varr anfordere, erhalte ich auch 11 und 7.

So weit, ist es gut.

Versuchen wir es jetztpFarr++ undpVarr++. Toll. Wir schauen uns jetzt wie erwartet 22 und 8 an.

Aber jetzt...

Ich versuche aufzusteigenfarr++ undvarr++ ... und wir bekommen "falsche Argumente zum Inkrementieren".

Jetzt erkenne ich den Unterschied zwischen einem Array-Zeiger und einem regulären Zeiger, aber warum diese Einschränkung, da ihr Verhalten ähnlich ist?

Das verwirrt mich weiter, wenn ich bedenke, dass ich im selben Programm die folgende Funktion scheinbar korrekt und auf andere falsche Weise aufrufen kann und dass ich das gleiche Verhalten erhalte, obwohl es im Gegensatz zu dem steht, was im obigen Code passiert ist !?

working_on_pointers ( pFarr, farr );  // calling with expected parameters
working_on_pointers ( farr, pFarr );  // calling with inverted parameters 

.

void working_on_pointers ( int *pExpect, int aExpect[] ) {

    printf("%i", *pExpect);  // displays the contents of pExpect ok
    printf("%i", *aExpect);  // displays the contents of aExpect ok

    pExpect++;               // no warnings or errors
    aExpect++;               // no warnings or errors

    printf("%i", *pExpect);  // displays the next element or an overflow element (with no errors)
    printf("%i", *aExpect);  // displays the next element or an overflow element (with no errors)

}

Könnte mir jemand helfen, zu verstehen, warum sich Array-Zeiger und Zeiger in manchen Kontexten ähnlich, in anderen jedoch unterschiedlich verhalten?

Vielen Dank.

BEARBEITEN: Noobs wie ich könnten weiterhin von dieser Ressource profitieren:http://www.panix.com/~elflord/cpp/gotchas/index.shtml

Antworten auf die Frage(6)

Ihre Antwort auf die Frage