Valerio Geschrieben 23. Oktober 2010 Geschrieben 23. Oktober 2010 Hallo liebe Fachinformatiker! ;-D Aufgrund eines geplanten Informatikstudiums bin ich gerade dabei mir C in Eigenregie, mithilfe C-HowTo - Programmieren in C, beizubringen. Bisher hat das auch ganz gut geklappt, nur das jetzige Kapitel verwirrt mich doch leicht und deshalb hoffe ich, dass mir jemand von euch helfen könnte. Worum es geht steht ja bereits im Titel - Zeigerarithmetik. Und zwar steht im Tutorial der besagten Seite folgender Code: // Array und Spaltengrenze setzen int brett[8][8]={ 0 }, Y_Max=8; // Startposition int *posStart = &brett[0][0]; // Testwert setzen brett[2][4] = 2; // Beschaffung Testwert mit Zeigerarithmetik int *pos; pos = posStart + (2 * Y_Max) + 4; printf("%d\n", *pos ); 2 Und dazu diese Erklärung: Die entscheidende Programmzeile ist die, in der der Positionszeiger pos gesetzt wird. Seine Basis ist die Startadresse des Arrays. Benötigt wird der Wert 4 in Spalte 2, Index [2][4]. Um dorthin zu kommen, müssen wir uns spaltenweise vorarbeiten. Also setzen wir den Zeiger auf das erste Element in Spalte 2. Eine Spalte hat 8 Elemente, also müssen wir den Zeiger 2 * 8 Elemente weiterrutschen. Zum Schluss addieren wir noch die 4, um in die vierte Zeile zu springen. Anfangs eigentlich ziemlich plausibel, zumindest bis zum Punkt, in dem der Testwert beschaffen wird. Ab da versteh ich irgendwie garnichts mehr. In der Erklärung steht ja, dass der Wert 4 benötigt wird. Warum? Und das ganze auch in der 2. Spalte des Arrays... das verwirrt mich gerade leicht. Ich dachte die erste Zahl der Deklaration eines zweidimensionalen Arrays bezieht sich auf die Zeilen -> index[2][4]. Kurzum... ich steh ziemlich auf dem Schlauch und wär wirklich froh, wenns mir jemand anfängerfreundlich erklären könnte. Danke im voraus! Mfg Zitieren
unbenannt Geschrieben 23. Oktober 2010 Geschrieben 23. Oktober 2010 (bearbeitet) M.E. ist die Formulierung sehr unglücklich. Es ist ja weder Wert 4, noch der 4. Wert, sondern der Wert des Arrayelements mit dem Index 4. Es ist auch nicht Spalte 2 die 2. Spalte, sondern die 3. Spalte bzw. die Spalte mit Index 2. Lassen wir Spalten und Zeilen einmal außen vor: wir haben hier ein zweidimensionales Array - genauer: ein 8-elementiges Array, dessen Elemente wiederum aus 8-elementigen Arrays bestehen. In Zeile 2 wird folgendes erzeugt: [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]] In Zeile 5 wird der Zeiger "posStart" auf das erste Element des ersten Arrays gesetzt: [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]] ..^(posStart) Anschließend wird "brett[2][4]" (5. Element des 3. Arrays) der Wert 2 zugewiesen: [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,2,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]] ..^(posStart) Nun folgt: pos = posStart + (2 * Y_Max) + 4; Nehmen wir einfach mal an, wir wollen an den Anfang des 3. Arrays (Index 2) gelangen, also nach "brett[2][0]". Das heißt, wir müssen 2 Arrays mit jeweils 8 Elementen überspringen, also "2 * Y_Max" mit Y_Max = 8. Mit "pos = posStart + 2* Y_Max" gelangen wir an folgende Position: [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,2,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]] ......................................^(pos) Wir wollen aber den Testwert haben, welcher aber nicht der Wert 4 ist und auch nicht der 4. Wert, sondern der Wert des Elementes mit Index 4 - also das 5. Element. Daher wird zu "pos" noch einmal 4 hinzu addiert. [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,2,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]] ..............................................^(pos) Zu Beginn meiner Ausbildung wurde ich sehr frühzeitig mit C konfrontiert. Pointer waren für mich die größte Hürde, da ich nur Java kannte. Ein Arbeitskollege hat mir bei Fragen immer wieder "Bildchen" gezeichnet, um mir eine Vorstellung davon zu vermitteln, was überhaupt im Speicher vor sich geht. Da dies sehr viel zu meinem Verständnis beigetragen hat, habe ich jetzt einfach mal versucht, zu verbildlichen, wie zum Einen das Array aufgebaut ist und zum Anderen, wo die jeweiligen Zeiger eigentlich "hinzeigen". Bearbeitet 23. Oktober 2010 von unbenannt Code-Tags aufgrund zerschossener Formatierung eingefügt Zitieren
flashpixx Geschrieben 23. Oktober 2010 Geschrieben 23. Oktober 2010 ich verweise mal nur: Feld (Datentyp) ? Wikipedia Zitieren
Valerio Geschrieben 24. Oktober 2010 Autor Geschrieben 24. Oktober 2010 Genau so stell ich mir eine gute Erklärung vor. Danke an dich unbenannt, hab's jetzt verstanden. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.