Forum: PC-Programmierung C/C++: Warum ist a[n] äquivalent zu n[a]?


von Dummer August (Gast)


Lesenswert?

Hallo,

ich habe gerade ein kleines Verständnisproblem.
Es gilt ja in C und C++, dass a[n] äquivalent ist zu n[a]. Leider komme 
ich nicht darauf, warum das so ist.

Beispiel:
a ist ein int-Array, welches an Adresse 1000 (dez.) beginnt, int-Größe 
im Beispiel 4 Bytes.
int a[]{1, 2, 3};

1000 1
1004 2
1008 3

Bei a[2] also sinngemäß
a + 2 * sizeof(int) = 1000 + 2 * 4 = 1008
a[2] -> *(a + 2 * sizeof(int)) -> 3

Aber warum funktioniert das umgekehrt?
2[a]
2 + a * sizeof(int) = 2 + 1000 * 4 = 4002 (?)
a "degeneriert" hier doch zu einem int*, bei Addition müsste also 1000 * 
4 addiert werden, nicht 1000?
Ist aber offensichtlich nicht so, denn sonst wäre a[2] ja nicht gleich 
2[a].

von Fred (Gast)


Lesenswert?

Ganz einfach: weil der Sprachstandard es so definiert.

a[n] ist per definitionem äquivalent zu *(a + n). Und da + kommutativ 
ist...

von lalala (Gast)


Lesenswert?

Dummer August schrieb:
> Bei a[2] also sinngemäß
> a + 2 * sizeof(int) = 1000 + 2 * 4 = 1008
> a[2] -> *(a + 2 * sizeof(int)) -> 3

So ist das zwar sinngemäß, aber nicht in Wirklichkeit. In 'Wirklichkeit' 
ist

b[c] = *(b+c) = *(c+b) =c[b]

Alle 4 Ausdrücke sind äquivalent.

von Arc N. (arc)


Lesenswert?

Dummer August schrieb:
> Hallo,
>
> ich habe gerade ein kleines Verständnisproblem.
> Es gilt ja in C und C++, dass a[n] äquivalent ist zu n[a]. Leider komme
> ich nicht darauf, warum das so ist.
>
> Beispiel:
> a ist ein int-Array, welches an Adresse 1000 (dez.) beginnt, int-Größe
> im Beispiel 4 Bytes.
> int a[]{1, 2, 3};
>
> 1000 1
> 1004 2
> 1008 3
>
> Bei a[2] also sinngemäß
> a + 2 * sizeof(int) = 1000 + 2 * 4 = 1008
> a[2] -> *(a + 2 * sizeof(int)) -> 3
>
> Aber warum funktioniert das umgekehrt?
> 2[a]
> 2 + a * sizeof(int) = 2 + 1000 * 4 = 4002 (?)
> a "degeneriert" hier doch zu einem int*, bei Addition müsste also 1000 *
> 4 addiert werden, nicht 1000?
> Ist aber offensichtlich nicht so, denn sonst wäre a[2] ja nicht gleich
> 2[a].

Die Definition aus dem Standard (6.5.2.1 Array Subscripting) für
E1[E2] ist (*((E1) + (E2))).
Jetzt kommt 6.5.6 Additive Operators hinzu:
Wenn bei einer Addition ein Teil ein Zeiger ist, ist das Ergebnis 
wiederum ein Zeiger d.h. (E1) + (E2) ist gleich zu (E2) + (E1)

von Dirk B. (dirkb2)


Lesenswert?

Dummer August schrieb:
> Aber warum funktioniert das umgekehrt?
> 2[a]
> 2 + a * sizeof(int) = 2 + 1000 * 4 = 4002 (?)

Eben nicht.
a ist ein Pointer und der wird nicht mit sizeof multipliziert.
2 ist ein integer und der wird mit dem sizeof vom Pointertyp 
multipliziert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.