Mehrdimensionale arrays und Zugriff per Pointer
-
hi,
ich habe ein problem mit mehrdimensionalen arrays und pointern.
angenommen, ich habe folgendes array:
int multi[5][10];
dieses wird jetzt gefüllt und anschließend will ich auf sagen wir das 1. element in der 4. zeile zugreifen.
um an die adresse dieses elements zu gelangen, kann ich ja nun entweder
&multi[3][0]
oder
*(multi + 3)
schreiben, wobei mir nicht klar ist, wieso hier in der zweiten version der derefernezierungsoperator * vorangestellt werden muss.
wieso nicht einfach
multi+3
?
wäre nett, wenn mir das jemand deutlich machen könnte
danke
-
-
Hallo,
ein Array zerfällt in den meisten Situationen in ein "Zeiger-auf-erstes-Element". multi + 3 liefert dir deshalb einen Zeiger auf das erste Element eines fünfelementigen int-Arrays. Das ganze dereferenziert und du hast ein int-Array (mit fünf Elementen) oder zerfallen: Ein Zeiger auf das erste Element eines int-Arrays.
-
sorry, aber damit kann ich leider nichts anfangen. ich bin genauso schlau wie vorher
gibt es nicht irgendwo eine grafische veranschaulichung oder sowas in der art? mir würde glaube ich auch eine step on step-anleitung helfen, die jeden schritt genau erklärt.
-
Ok. Also nochmal Schritt für Schritt.
Ich gehe davon aus, dass du den Zusammenhang zwischen Arrays und Pointern kennst.
Das du insbesondere weißt, dass ein Array in den allermeisten Situationen
als Zeiger auf das erste Element betrachtet werden kann.Nehmen wir das Array:
int multi[5][10];
Der Typ sollte klar sein: int[5][10].
Betrachtet man nun das Array nun als "Zeiger auf das erste Element",
dann erhält man int(*)[10], also Zeiger auf ein int-Array mit zehn Elementen// p zeigt auf das erste Element von multi. // Das erste Element ist ein Array von zehn ints! int (*p)[10] = multi;
Jetzt addieren wir drei:
multi + 3
Wir gehen also drei zehn-elementige Arrays weiter, der Ergebnistyp ist aber
nach wie vor ein Zeiger auf ein int-Array mit zehn Elementen.// p zeigt auf das vierte Element von multi. // Das vierte Element ist ein Array von zehn ints! int (*p)[10] = (multi + 3);
Jetzt dereferenzieren wir diesen Zeiger auf ein int-Array mit zehn Elementen.
Wir erhalten ein int-Array mit zehn Elementen.// p referenziert ein zehn-elementiges int-Array. int (&p)[10] = *(multi + 3);
Wir haben also wieder ein Array und das kann man natürlich wieder
als Zeiger auf das erste Element betrachten. Das erste Element eines
int-Array ist ein int. Also ist ein Zeiger auf das erste Element ein
Zeiger auf int:// Zeiger auf das erste Element des vierten zehn-elementigen Arrays int* p = *(multi + 3);
Verständlich?
-
1. multi ist ein Pointer auf das erste Element des Arrys, in deinem Fall multi[0][0].
2. Um auf das Element zuzugreifen, auf das ein Pointer zeigt muss man ihn dereferenzieren.
3. Laut Pointerarithmethik bedeuteted multi + 3 den Pointer auf multi plus dreimal die größe des Datentyps( In dem Fall sizeof(int)) weiterzuschieben (arrayelemente liegen ja hintereinander im Speicher).
4. Weil man nicht auf multi, sondern auf multi+3 zugreifen will wird das in Klammern gesetzt.
5. Jetzt hat man einen Pointer auf multi[3][0].
mfg
Glamdring
-
Mist, Hume war schneller
-
danke. ich denke, wenn ich mir nun noch ein wenig literatur zu dem thema besorge, wird mir das ganze wohl noch um einiges klarer.
-
Betrachtet man nun das Array nun als "Zeiger auf das erste Element",
dann erhält man int(*)[5], also Zeiger auf ein int-Array mit fünf ElementenSollte es nicht int(*)[10] heißen?
Jede Zeile hat 10 Elemente.
Sollte es nicht auch in allen weiteren Beispielen 10 statt 5 heißen?
-
Damit fängst du dir eine eklige Bereichsüberschreitung, dass Array ist int[5][10], d.h. das letzt Element ist [4][9].
mfg
Glmadring
-
Ja und?
Es sind dennoch 10 Elemente
-
Bei einem Array int[4] gibt es int[0, 1, 2, 3] und nicht mehr, also würde int[4] voll ins leere hauen und undef. Verhalten erzeugen -> Viel Spaß
mfg
Glamdring
-
Bei einem Array int[4] gibt es int[0, 1, 2, 3] und nicht mehr, also würde int[4] voll ins leere hauen und undef. Verhalten erzeugen -> Viel Spaß
Ich glaub du checkst es nicht ganz.
int(*)[10]
Das hier ist ein Pointer auf 10 (!) ints.
Ich habe nie auf das Element 10 zugegriffen!
-
hmmmmmmmmm schrieb:
Betrachtet man nun das Array nun als "Zeiger auf das erste Element",
dann erhält man int(*)[5], also Zeiger auf ein int-Array mit fünf ElementenSollte es nicht int(*)[10] heißen?
Jede Zeile hat 10 Elemente.
Sollte es nicht auch in allen weiteren Beispielen 10 statt 5 heißen?Ups. Da hast du natürlich recht.
Ich korrigiere...
-
Ups. Da hast du natürlich recht.
Ich korrigiere...
Joa. Wollte net flamen sondern nur verhindern, dass irgendwer noch mehr verwirrt ist.