Created
October 7, 2011 16:56
-
-
Save sahib/1270791 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Ü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