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 als float **a3 definierst 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!


Anmelden zum Antworten