Frage zu Mehrdimensionale Arrays
-
Moin zusammen!
Als Anfänger in der Programmiersprache C/C++ stellt mich für mich die Frage,
warum bei dem folgenden Code:int test[2][2]={{0,0},{0,0}};
man in den Klammern "[]" eine zwei schreiben muss, wobei es bei einer Abfrage bei einer "0" startet bzw weniger als zwei Werte (=> [1]?) eingetragen sind?
MfG
-
Es werden doch zweimal zwei Werte eingetragen, daher schreibst du dort zweimal "2" hin. Da der Index bei "0" beginnt, erfolgt der Zugriff auf die Elemente mit "[0]" und "[1]".
Du solltest dir aber generell mal std::vector ansehen. Es gibt leider immer noch Leermaterial*, in dem die Standardbibliothek nicht erwähnt wird.
* Schreibfehler beabsichtigt
-
Bei einer Array-Deklaration gibst du in den eckigen Klammern die Größen der jeweiligen Dimensionen an, in Elementen. Also ganz intuitiv.
Der Witz bei Arrays ist aber folgender. Wenn du ein Array
arr
deklarierst:int arr[5];
Dann ist
arr
zwar syntaktisch gesehen ein "Array" (du wirst spezifische Sachen mit Arrays später feststellen, bspw.sizeof(arr)
);
Jedoch kann manarr
in vielen Situationen als den Zeiger auf das erste Element betrachten. Das liegt daran, dassarr
implizit zu einem Zeiger auf das erste Element konvertierbar ist (siehe array to pointer decay), und daher in vielen Ausdrücken eben zu einem Zeiger auf das erste Element zerfällt.Wenn arr sich implizit zu einem Zeiger auf das erste Element konvertieren lässt, dann ist schon klar, wie man Arrayzugriffe am effizientesten implementiert:
arr[x]
ist äquivalent zu
*(arr + x)
Und hier siehst du auch den Grund für diese Indizierung. Willst du auf das erste (1) Element zugreifen, musst du
arr[0]
schreiben, weil der Ausdruck...a[0]
*(a + 0)
*a
...dann zu einer Dereferenzierung des Zeigers auf das gewünschte Element wird.
*Damit meine ich, es ist intern nur ein Zeiger. Zwar gibt der
sizeof
-Operator die Anzahl der im Stack dafür reservierten Bytes zurück, aber...
-
Vielen Dank für die ausführlichen Antworten.
Bei folgendem Code:
int test[]={1,2,3,4};
wird "automatisch" bzw die (An-)Zahl in den eckigen Klammern / die Größe des Array festgestellt.
Wieso wird bei einem mehrdimensionale Array (=> int test[][]={{1,2,3,4},{1,2,3,4}}) dieses "Prinzip" nicht "übertragen" bzw angewendet?
Folgende Fehlermeldung habe ich vom Compiler bekommen:
[Error] declaration of 'test' as multidimensional array must have bounds for all dimensions except the first
MfG
-
Sone schrieb:
Jedoch ist
arr
"in Wirklichkeit"* nur der Zeiger auf das erste Element.Das ist bestenfalls bloß falsch, und ansonsten völlig sinnlos, sofern du nicht erklärst, welchen Erkenntniswert
"in Wirklichkeit" habe soll.
-
Sone schrieb:
Bei einer Array-Deklaration gibst du in den eckigen Klammern die Größen der jeweiligen Dimensionen an, in Elementen. Also ganz intuitiv.
Der Witz bei Arrays ist aber folgender. Wenn du ein Array
arr
deklarierst:int arr[5];
Jedoch ist
arr
"in Wirklichkeit"* nur der Zeiger auf das erste Element.Was laberst du da. Ein Array ist ein Array. Ein Zeiger ist ein Zeiger. Ein float kann implizit auch in ein int konvertiert werden. Sagst du nun auch, ein float ist ein int?
@email25251990a Denke immer daran, ein Array ist kein Zeiger, lass dir sowas bloß nicht einreden.
-
Natürlich ist ein Array kein Zeiger.
Ok, da habe ich mich mit den Begrifflichkeiten vertüdelt.
Natürlich ist ein Array (auch nicht in "Wirklichkeit") ein Zeiger.Aber allein die Tatsache, dass es so leicht in einen Zerfällt, zeigt, dass Operationen wie der Zugriff über den Indexoperator auf Zeigerarithmetik deduziert werden.
Sprich: Man kann ein Array in bestimmten Situationen einfach wie einen Zeiger auf das erste Element behandeln.Sagst du nun auch, ein float ist ein int
Das ist was völlig anderes. Wenn du den Unterschied nicht verstehst, dann ist es dein Problem.
-
Bytes sind Bytes, ein float ist ein int.