Skip to content

Instantly share code, notes, and snippets.

@sahib
Created October 7, 2011 16:56
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save sahib/1270791 to your computer and use it in GitHub Desktop.
// Übungsbeispiel Stöhr
// man sollte erst versuchen es selbst zu lösen und dann das hier zu lösen.
// (Ich bin mir nicht sicher was schwerer ist :-))
// Sind vermutlich ein paar Fehler drin - einfach unten posten.
// (Anmerkung: Die Kommentare sind nicht von Prof. Stöhr)
#include <stdio.h>
/* Ein Array aus Strings */
char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
/* Ein Array aus Pointern auf Strings
* Dazu sollte man wissen wie mehrdimenionale Arrays
* gespeichert werden (ein String ist ein Array aus Buchstaben,
* c ein array aus dieses Buchstabenrrays):
* In Speicher liegt c folgendermaßen:
*
* [0]ENTER[1]NEW[2]POINT[3]FIRST
* Wobei die Zahlen in den Klammern "offsets" sind.
* (Man kann ja über c[n] auf die strings zugreifen)
* c[0] ist dabei dasselbe wie *(c + 0), allegemein:
* c[n] -> *(c + n)
* Die Addresse von c zeigt also auf das erste element. Huch.
* Worauf zeigt dann c+3? *(c +3) -> c[3] -> "FIRST"
* Also stehen da Zeiger auf Strings: (zeiger. keine Strings an sich.)
* ( & ist der Adressoperator)
*
* char ** cp[] = {&("FIRST), &("POINT"), &("NEW"), &("ENTER")}
* */
char **cp[] = {c+3, c+2, c+1, c};
/*
* Für den letzen touch mindfuck:
* Nochmal ein pointer auf das array aus pointern die
* die auf pointer zeigen ;-)
*/
char ***cpp = cp;
int main(void)
{
/* ++ hat eine höhere Priorität als '*'
* cpp zeigt am Anfang auf cp,
* nach dem inkrement zeigt es auf (cp+1)
* Derefenziert man diese Adresse einmal,
* so landet man bei *(cp+1) = (c + 2)
* Noch mal derefernziert ist das:
* *(c + 2) = "POINT"
* Dies wird geprintet.
*
* ====== POINT
*/
printf("%s", **++cpp);
/* Hinweis: cpp zeigt auf (cp+2)
* ++cpp -> (cp+3)
* Deref: *(cp + 3) -> (c + 1)
* --(c+1) -> (c+0)
* (c+0) = "ENTER"
* "ENTER" + 3 = "ER"
*
* ====== ER
*/
printf("%s ", *--*++cpp+3);
/* Jetzt wird er wahnsinnig.
* cpp[-2] = *(cpp - 2)
* *(cpp - 2) => *(cp + 0) // wir haben vorher zweimal inkrementiert.
* *(cp + 0) => c + 3
* c + 3 = "FIRST"
* "FIRST" + 3 = "ST"
*
* ===== ST
*/
printf("%s", *cpp[-2]+3);
/* cpp zeigt immernoch auf (cp+2)
* cpp[-1][-1] = *(*(cpp-1)-1)+1
* Wenn cpp auf (cp + 2) zeigt, so ist
* *(cpp - 1) = cp + 1
* *(cp + 1) ist (c + 2)
* *((c + 2) - 1) = *(c + 1)
* *(c + 1) = "NEW"
* "NEW" + 1 = "EW"
*
* ======== EW
*/
printf("%s\n", cpp[-1][-1]+1);
return 1;
// POINTER STEW!
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment