Inkrement, Dekrement, Pointer
-
Hallo zusammen,
ich habe hier einen Quellcode, welchen ich nicht zu 100% verstehe.
#include<stdio.h> #include<stdlib.h> void main (void) {int zahlen [10] = {1,2,3,4,5,6,7,8,9,10}; int *ptr, i=0; ptr = zahlen; // was bedeutet dieser Audruck ? printf("%i \n", zahlen [i]); printf("%i \n", ptr [i]); printf("%i \n", zahlen [i++]); // zahlen[i] wird ausgegeben dann um 1 erhöht auf 2 printf("%i \n", i); //warum wird hier immer noch 1 ausgegeben ? i wurde doch eben erhöht printf("%i \n", zahlen [--i]); printf("%i \n", * (zahlen+0)); printf("%i \n", ptr [i++]); ptr = zahlen +1; // was bedeutet diese Zeile verstehe ich nicht ganz printf("%i \n", *(ptr)); printf("%i \n", zahlen[i]); printf("%i \n", ++i); printf("%i \n", * (zahlen+i++)); printf("%i \n", i++-i--); system("PAUSE"); }
Ausgabe:
1 1 1 1 1 1 1 2 2 2 3 0
-
vatan89 schrieb:
Hallo zusammen,
ich habe hier einen Quellcode, welchen ich nicht zu 100% verstehe.
#include<stdio.h> #include<stdlib.h> void main (void) {int zahlen [10] = {1,2,3,4,5,6,7,8,9,10}; int *ptr, i=0; ptr = zahlen; // der Zeiger ptr zeigt jetzt auf zahlen[0] - den Arraybeginn printf("%i \n", zahlen [i]); printf("%i \n", ptr [i]); printf("%i \n", zahlen [i++]); // zahlen[i] wird ausgegeben dann um 1 erhöht auf 2 printf("%i \n", i); //hier wird i ausgegeben i wurde doch eben erhöht --> von 0 auf 1 printf("%i \n", zahlen [--i]); printf("%i \n", * (zahlen+0)); printf("%i \n", ptr [i++]); ptr = zahlen +1; // der Pointer zeigt nun auf das zweite Arrayelement zahlen[1] printf("%i \n", *(ptr)); printf("%i \n", zahlen[i]); printf("%i \n", ++i); printf("%i \n", * (zahlen+i++)); printf("%i \n", i++-i--); system("PAUSE"); }
Ausgabe:
1 1 1 1 1 1 1 2 2 2 3 0
-
vatan89 schrieb:
printf("%i \n", zahlen [i++]); // zahlen[i] wird ausgegeben dann um 1 erhöht auf 2
Das stimmt übrigens nicht. Ausgegeben wird zahlen[i] (konkret: zahlen[0], denn i hat den Wert 0); erhöht wird anschließend i von 0 auf 1 und nicht zahlen[0]!
-
Warum kein Adressoperator vor zahlen?
-
Aso stimmt, i=0 alles klar, danke.
Ich zweifle etwas an meinem Wissen daher korrigiert mich bitte.
ptr [i++] = gibt doch den Inhalt aus auf dem der pointer zeigt.
*(ptr)= das * gibt doch eigentlich die Adress aus oder :S
-
vatan89 schrieb:
Aso stimmt, i=0 alles klar, danke.
Ich zweifle etwas an meinem Wissen daher korrigiert mich bitte.
ptr [i++] = gibt doch den Inhalt aus auf dem der pointer zeigt.
*(ptr)= das * gibt doch eigentlich die Adress aus oder :SAlso erstmal: Ausgegeben wird da gar nichts, das sind einfach Ausdrücke. Die haben einen Wert. Den Wert kann man dann ggf. irgendwie ausgeben.
Der Ausdruck
ptr[i++]
hat den Wert, der an der Stelle(ptr + i)
steht (unter Brücksichtigung der üblichen Regeln für Pointerarithmetik bezüglich dieser Addition). Der Ausdruck hat zudem noch den Nebeneffekt,i
um 1 zu erhöhen, aber dieser Effekt findet bei der Berechnung des Werts des Ausdrucks noch keine Anwendung, der Effekt tritt erst ein, nachdem der Teilausdrucki++
zum Wert voni
ausgewertet wurde.Der Ausdruck
*(ptr)
hat den Wert auf denptr
zeigt.Ich fürchte daher, du warst in beiden Fällen, besonders dem zweiten, noch ziemlich auf dem Holzweg. Wie lernst du C? Ein gutes Lehrbuch sollte bei diesem (wichtigen) Thema eigentlich nicht so große Unklarheiten lassen.
-
ok danke ich habe es verstanden, nur habe ich jetzt noch ein winziges Problem und möchte deshalb jetzt keinen neuen Beitrag erzeugen.
#include<stdio.h> #include<stdlib.h> void main () { int feld[6] = {0,8,15,16,17,18}; int i=0; int *ptr, *ptr2; ptr=feld+2; ptr2=ptr+1; printf("%i\n",ptr2-ptr); //Ausgabe : 1 diese Ausgabe ist klar printf("%i\n",ptr2-feld); //Ausgabe : 3 , doch bei dieser Ausgabe verstehe ich garnichts. ptr2=16, daher 16-[?]=3 ??? system("PAUSE"); }
-
In deinem Feld kann drinstehen was will. Das ist hier völlig belanglos. Das ist ganz einfaches Rechnen. Hab keine Angst vor Zeigern! Ich schreibe es mal anders:
int feld = 3762483642827; int ptr = feld + 2; int ptr2 = ptr + 1; printf("%i\n",ptr2-ptr); // Offensichtlich 1 printf("%i\n",ptr2-feld); // Was kommt hier wohl raus?
-
boah, jetzt habe ich es geschnallt. Klasse Beispiel.
Feld kann sein was es will:
int ptr = feld + 2;
int ptr2 = ptr + 1;oder anders geschrieben
ptr2 = feld+2+1
und
ptr2 - feld = feld+2+1-feld = 3
haha, vielen Dank