M
Zu Beginn sieht es wie folgt aus:
cpp zeigt auf cp[0]
cp = {c+3, c+2, c+1, c}
1. Zeile
printf( "%s", **++cpp );
++cpp : erhöht den Zeiger cpp um 1 * sizeof(*cpp)
*cpp : dereferenziert den Zeiger. Mit ++cpp zeigt *cpp auf c+2
Damit ist **++cpp der Zeiger auf "C i"
Nach dieser Zeile sieht es dann so aus:
cpp zeigt auf cp[1]
cp = {c+3, c+2, c+1, c}
2. Zeile
printf( "%s", *--*++cpp+5 );
++cpp : erhöht den Zeiger cpp um 1. also auf cp[2]
*++cpp : Zeiger auf c[1], (Inhalt von cp[2])
--*++cpp : die Speicherstelle cp[2] wird mit dem Zeiger auf c überschrieben
Damit ist dann *--*++cpp der Zeiger auf "he dast ga".
*--*++cpp +5 setzt den Zeiger um 5 Stellen im String weiter: "st ga" wird ausgegeben.
Nach dieser Zeile sieht es nun so aus:
cpp zeigt auf cp[2]
cp = {c+3, c+2, c, c}
3. Zeile
printf( "%s", cpp[-2][0]+2 );
cpp[-2] : ist das gleiche wie *(cpp-2) hier also: c+3
cpp[-2][0]: ist das gleiche wie *(*(cpp-2)): also der Zeiger auf "dar nich"
Damit ist dann cpp[-2][0]+2 das gleiche wie *(*(cpp-2))+2: also der Zeiger auf "r nich"
Nach dieser Zeile sieht es so aus:
cpp zeigt auf cp[2]
cp = {c+3, c+2, c, c}
4. Zeile
printf( "%s\n", *(cpp[1]+1)+3 );
cpp[1] : das gleiche wie *(cpp+1). hier also: c
cpp[1]+1 : c+1
*(cpp[1]+1): Zeiger auf den String "lllt dumm"
Dann wird noch der Zeiger um 3 Einheiten weitergeschoben: "t dumm"
Das Ergebnis ist dann: C ist gar nicht dumm
Das war doch nun nicht wirklich schwer, oder?
Gruß mcr