Zeigersalat ... pls help
-
Ich steh mit der Zeigerarethmetik noch ein wenig auf dem Schlauch und bin bei folgenden etwas koplexeren Codestücken ein wenig überfordert:
#include <stdio.h> char * tab [] = {"Falle", "Maus", "Kaefig", "Gericht"}; char ** ptab [] = {tab + 3, tab +2, tab + 1, tab}; char *** ppp = ptab; int main (int agc, char * argv []) { printf("%s\n", *(*(ppp + 2) -1) + 1); printf("%s\n", ppp[2] [0] +3); printf("%s\n", *(* ++ppp +1) + 2); printf("%s\n", ** ppp +4); return 0; }
Ausgabe:
- alle
- s
- richt
- ig
Kann mir jemand etwas genauer erklären wie diese Ausgabe zustande kommt ? Ich durchblick das einfach nicht ...
-
wozu brachst du sowas???? omg
-
Kann mir jemand etwas genauer erklären wie diese Ausgabe zustande kommt ? Ich durchblick das einfach nicht ...
Im Detail? Da habe ich keine Zeit zu. Nur ein paar Primer kann ich dir mitgeben: Ein Array kann ich immer als Zeiger verwenden, indem ich nur den Namen des Arrays ohne Subskript-Operator verwende. Genauso kann ich einen Zeiger immer als Array ansprechen, indem ich den Subskript-Operator anwende.
(Subskript-Operator = operator[] = arrayname[xtesElement])
Das liegt dieser "Spielerei" zugrunde. Dabei muss man aufpassen, daß man dereferenziert, wo es nötig ist. Du kannst dir dabei leicht etwas versauen, wenn du eine Adresse mit "A" überschreibst oder versuchst, eine Folge von Adressen als String auszugeben.
Wenn du das verstehen willst, mal es dir auf und mach einen "Schreibtischtest".
-
macht genau das selbe wie
int main( ) { printf( "%s\n", *ppp[ 3 ] + 1 ); printf( "%s\n", *ppp[ 2 ] + 3 ); printf( "%s\n", *ppp[ 0 ] + 2 ); printf( "%s\n", *ppp[ 1 ] + 4 ); }
und ist eine unnötige Spielerei, welche IMHO auch das Verständnis für Zeiger nicht positiv beeinflusst.
@Sid2K6: Ich denke du meinst den Bleistift-Test
Greetz, Swordfish
-
Shoo schrieb:
Ausgabe:
- alle
- s
- richt
- ig
Hmmm, scheint doch "alles richtig" zu sein
*scnr*
-
ja richtig ist es auch ... das kurz zu compilieren ist ja nicht schwer. Es geht mir eben nur darum das auch ohne rechner hinzubekommen. Da scheint wohl dieser erwähnte bleistift-test wohl angebracht für sein ... mir ist der nur leider noch nicht ganz klar *räusper*
-
Bleistift-Test bedeutet wohl, dass du dir die erste Zeile deines Codes nimmst, und dir den Speicher auf ein Blatt Papier malst. Dann kannst du die Zeiger, die in dem Code benutzt werden Stück für Stück nachvollziehen.
Kleiner Ansatz:
tab[0] -> 'F','a','l','l','e','\0'
tab[1] -> 'M','a','u','s','\0'
tab[2] -> 'K','a','e','f','i','g','\0'
tab[3] -> 'G','e','r','i','c','h','t','\0'Wobei tab[0] genau auf das 'F' von "Falle" zeigt. Wenn du nun auf tab[0]+1 zugreifst, wärest du beim 'a' von "Falle" usw.
-
danke DarthZiu ... so ist es klar
und auch danke an die anderen...