Absolute Anfängerfrage - Array und Zeiger
-
Einfacher Quellcode:
int main() { float * a[3]; float x1[] = {1.0, 2.0, 3.0}; float x2[] = {4.0, 5.0, 6.0}; float x3[] = {7.0, 8.0, 9.0}; a[0] = x1; a[1] = x2; a[2] = x3; std::cout << "x1[0]: " << a[0][0] << std::endl; std::cout << "x2[1]: " << a[1][1] << std::endl; std::cout << "x3[2]: " << a[2][2] << std::endl; return 0; }Ich dachte, in beispielsweise a[0] sei nun die Adresse von x1 (sprich dem ersten Element des Arrays) gespeichert. Ich habe auf den Wert mit *a[0] zugegriffen.
Wieso wird hier mit mehrdimensionalen Arrays gearbeitet, um an die Werte zu gelangen? Wie funktioniert das?
Danke für eure Hilfe :).
-
wieso es gemacht wird? ka, das ist ja nichtmal ein richtiges programm...
wie es funktioniert? hast du doch selbst beschrieben.wenn du wirklich c++ lernen willst, dann mach es bitte korrekt. das was du da hier gepostet hast hat einen speicheroverhead von
x * sizeof(float*)und du musst, wenn du an einen wert gelangen willst, zwei mal dereferenzieren. in c++ würde man - je nach anwendungsfall - entweder einfach ein 1d-array (std::vector&std::array) so behandeln als wäre es 2d oder man würde sich eine klasse schreiben, die das übernimmt.
-
Ob du x1[1] schreibst oder *(x1+1) ist völlig egal (Der Compiler wandelt für sich die Arrayschreibweise in die Zeigerschreibweise um)
Von daher entspricht ein Arrayzugriff einer Dereferenzierung vom Zeiger.a[0][0] ist *(a[0] + 0) = *a[0]Salia7 schrieb:
Ich dachte, in beispielsweise a[0] sei nun die Adresse von x1 (sprich dem ersten Element des Arrays) gespeichert.
Stimmt ja auch.
Salia7 schrieb:
Wieso wird hier mit mehrdimensionalen Arrays gearbeitet,
Hier wird nicht mit mehrdimensionalen Arrays gearbeitet.
Das sieht nur so aus.Hier wird mit Zeigerarrays gearbeitet.
-
Danke Dirk B, das hat mir sehr geholfen :).
-
Zur Klarstellung:
Ein echtes Array
float mat[3][3];ist ein zusammenhängender Speicherbereich, dessen Größe und Lage nicht mehr verändert werden kann.
Der Speicherbedarf ist (hier) 3*3*sizeof(float)In deinem Beispiel sind das vier Speicherbereiche (a0, x1, x2, x3)
a0 ist ein Array von Zeigern auf float.
Der Speicherbedarf ist 3*sizeof(float*)+3(3sizeof(float))Hier kannst du jederzeit die Zeiger in a0 austauschen. Auch gegen längere Arrays.
Wenn du a3 alsfloat **a3definierst und dafür den Speicher auch dynamisch anforderst, kannst du auch die (Zeilen-)Anzahl verändern.
Aber das ist mehr C-like und nutzt nicht die Möglichkeiten, die dir C++ bietet.
-

Tausendfachen Dank, sehr gut erklärt!