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

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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.