C/C++: Warum ist a[n] äquivalent zu n[a]?

Gast #4900418
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].
#4900442
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren