Zum Inhalt springen

Zeigerarithmetik - Mehrdimensional


Empfohlene Beiträge

Geschrieben

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

Geschrieben (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 von unbenannt
Code-Tags aufgrund zerschossener Formatierung eingefügt

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...