Frage von memo12344321, 46

Wieso kommt hier 1020 raus?

int main(void){

int *p=1000; p +=5;
printf("%d",p); }

Meine Frage wäre wieso hier auf der Console 1020 erscheint? Normalerweise müsste doch 1005 erscheinen, da der Ausdruck auch als p = p + 5 gilt? Ich hab dies auch mit anderen Werten anstatt 5 getestet und jedesmal wurde es mit 4 multipliziert und 1000 dazu addiert

Antwort
von sarahj, 6

In C werden alle Zeigeroperationen mit der Größe des Elements (auf das der Zeiger zeigt) skaliert. Der Grund ist ganz einfach: damit man leicht durch die Elemente eines Arrays (auf den man einen Zeiger hat) iterieren kann.
Dies betrifft auch ++, -- sowie Subtraktion. Bei Subtraktion zweier Zeiger wird die Differenz ebenfalls durch die Größe geteilt, so daß Du den Index-Unterschied bekommst (*). Bei vielen Maschinen ist die size-in-Byte von int gleich 4 (bei manchen auch 8). Raus kriegst Du das mit sizeof(int).

Ein Trick dies zu umgehen ist, den Zeiger auf einen anderen Typ zu casten (also so zu tun, als zeigte er auf was anderes).
Z.B. würde der Code:
printf("%d", ((char *)p) + 5);
die erwarteten 1005 ausgeben.

(*) bei Multiplikation und Division bin ich gerade überfragt - müsste ein kleines Testprogramm schreiben oder nachlesen, wozu ich aber grad keine Lust habe ;-D
Überlasse ich Dir...

Antwort
von Suboptimierer, 20

Wenn du den Stern weg nimmst, kommt 1005 heraus. Der Stern deutet an, dass du einen Zeiger definieren willst. Mit p += 5 würdest du dann die Adresse, auf die der Zeiger zeigt, verschieben, nehme ich an.

Antwort
von DoTheBounce, 30

Es handelt sich um einen int-Pointer. Ein int ist 4Byte groß. Wenn du nun 5 hinzuaddierst, wird der Pointer um 5 integer-Plätze, also 20Byte, verschoben

Kommentar von memo12344321 ,

Vielen Dank :) ich liebe dich

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten