mehrdimensionale Array dynamisch einlesen



  • Hallo,

    ich habe eine kleine Frage bezüglich mehrdimensionalen Arrays, welche ich dynamisch erzeugen möchte. Ich habe dafür folgenden Code gefunden, möchte ihn jetzt aber komplett verstehen:

    int main()
    {
    int **matrix;
    int i;
    matrix = (int**) malloc(m * sizeof(int*));
    
    if (matrix == NULL) return NULL;
    
    for (i=0; i<m; i++)
    {
    matrix[i] = (int*) malloc(n * sizeof(int));
    if (matrix[i] == NULL) {
    int j;
    for (j=0; j<i; ++j)
    free(matrix[j]);
    free(matrix);
    return NULL;
    }
    }
    }
    

    mein Verständnisproblem ist in erster Linie der Doppelzeiger. Wieso brauche ich einen DOPPELzeiger? Enthält der nicht einfach nur die Adresse des Zeigers auf den er zeigt?! Ich kann mir irgendwie nicht (bildlich) vorstellen, wie damit die Indizierung der Matrix funktionieren soll (ich weiß, dass ich das dazu mache, aber kann mir nicht vorstellen wie es vonstatten geht). Für was sind die casts (stimmt das?!) von (int**) bzw (int*) vor den Allokationen nötig? Wäre euch sehr dankbar wenn ihr mir weiterhelfen könntet 🙂



  • matrix[zeile][spalte]

    Der erste Zeiger ist für die Zeile zuständig und der zweite für die Spalte. (man kann es natürlich auch andersrum machen, was aber unüblich ist)

    Die Casts brauchst du nicht.



  • Hi, erstmal danke für deine Antwort,

    ich habe nur ein Problem anschaulich zu verstehen, warum ich das mit einem doppelzeiger mache...wie kann der eine Zeiger die Spalten bzw. Zeilen erzeugen? Ich hätte gerne eine anschauliche Erklärung zum Code. 🙂



  • wie Erzeugen? Ein Zeiger kann nichts erzeugen. Der zeigt nur.

    Wenn 1,2,3 etc. die Daten sind, dann sieht das so aus

    (*) -> (*) ->  1,  2,  3,  4
        -> (*) ->  5,  6,  7,  8
        -> (*) ->  9, 10, 11, 12
        -> (*) -> 13, 14, 15, 16
        -> (*) -> 17, 18, 19, 20
    

    Der erste Zeiger zeigt auf ein Array von Zeigern und jeder Zeiger in dem Array zeigt auf ein Array von Integern. Jedes Array von Integern ist eine Zeile.



  • die zeiger im array von zeigern spiegeln meine zeilen wieder, jetzt kann ich mir aber nicht vorstellen, wie ich über den zeiger auf das zeigerarray an die spalten kommen soll...

    Edit:

    ich glaube ich habs:

    **p3
     -------------
                 |
                \/ 
        -------------------
    *p1  |  |  |  |  |  |
        -------------------
    *p2  |  |  |  |  |  |
        -------------------
    *p3  |  |  |  |  |  |
        -------------------
    

    mein problem war, dass ich die pointer-array dualität nicht vor augen hatte 😉



  • |   matrix[0][0] - matrix[0][1] -  ... - matrix[0][n-1]
        |      |
        |   matrix[1][0] - ... 
        |      |
      p |-> matrix[2][0] - ...
        |      |
    
        .
        .
        .
    
        |
        |  matrix[m-1][0] - matrix[m-1][1] - ... - matrix[m-1][n-1]
        |
        |
    
        int *p = matrix[2];
    

    :p


Anmelden zum Antworten