[Gelöst] Unterschied zwischen einem Array und Zeiger auf Array



  • Hallo!

    Wo liegt der Unterschied zwischen:

    func(char meinarray[]){
    //
    }
    

    und

    func(char *meinarray){
    //
    }
    

    Welche von beiden Varianten sollte man verwenden und wann? Beides scheint zu funktionieren. Wenn ich mich nicht irre, benötigt man Zeiger nur deshalb in C, weil man sonst keine andere Möglichkeit hat lokale Variablen zu verändern, da sie nicht weiter an Funktionen vererbt werden.

    Und wie erfolgt dann der Zugriff auf ein bestimmtes Element des Arrays, wenn ich dieses als Zeiger mit dem *-Operator übergebe? (also z.B. meinarray[2], aber jetzt mit dem *-Operator).

    Vielen Dank



  • Da ist kein Unterschied (als Paramter einer Funktion).

    Du kannst bei beiden Versionen auf die sleben Arten auf die Elemente zugreifen.
    *meinarray oder meinarray[0]
    *(meinarray+5) oder meinarray[5]
    Auch gemischt in einer Zeile ist kein Problem.



  • Es besteht auch kein Unterschied zw.

    void func(char meinarray[])
    

    und z.B.

    void func(char meinarray[1234])
    

    zumindest nicht bei nur einer Dimension.
    Unterschiedlich ist aber

    void func(char meinarray[][123])
    

    zu

    void func(char *meinarray[123])
    


  • Danke für Eure Antworten!

    Wo liegt in Deinem Beispiel der Unterschied zwischen:

    void func(char meinarray[][123])
    

    und

    void func(char *meinarray[123])
    

    Muss beim mehrdimensionalem Array die Spaltenanzahl übergeben werden? Wenn ja, warum muss dann die Anzahl der Zeilen nicht übergeben werden?

    Danke!

    PS: wenn *meinarray+i einem Vektor entspricht (meinarray[i]), dann müsste *meinarray[123] eine Matrix sein? (meinarray[i][123]). 😕



  • char array[][123]
    

    ist ein Array aus Elementen vom Array-Typ char[123]

    char *array[]
    

    ist ein Array aus Elementen vom Typ char*

    Da bei Funktionsparametern ein deklariertes Array immer in einen Zeiger auf das erste Arrayelement zerfällt, ist die erste/oberste Dimension immer redundant, d.h. du kannst da irgendeine Dimensionsgröße eintragen, da die Dimension sowieso zum Zeiger wird, hat das keine Auswirkungen.



  • Zum Verständnis: Mehrdimenionale Arrays (array[Dim1][Dim2]...[DimN]) liegen hintereinander weg im Speicher. Z.B. ist double array[2][2] ein feld der Länge 4 (2*2) und beim zugriff wird wird der Index wie folgt berechnet

    array[n][m] = ((double*) array)[2*n+m]
    

    (der cast soll dem Verständis dienen :D, also ich mein damit linke Seite array, rechte Seite Feld im Speicher)

    Das ist auch der Grund warum man bei einem N-dim array mindest N-1 dimensionen bei deklaration als Funktionsparameter angeben werden muss. Bsp:

    int funktion(int array[][4711])
    

    Sonst wäre es nicht möglich den Index zu berechnen.

    Und zum schluss noch: char *array[] ist etwas völlig anderes, das ist ein array mit zeigertypen ...



  • ScottZhang schrieb:

    Z.B. ist double array[2][2] ein feld der Länge 4 (2*2) und beim zugriff wird wird der Index wie folgt berechnet

    array[n][m] = ((double*) array)[2*n+m]
    

    ...

    Welche 2 ist es denn? Die erste oder zweite?

    Es ist die zweite.

    Bei einem Array array[HOEHE][BREITE] kann man also mit array[y][x] oder mit *(array+BREITE*y+x) darauf zugreifen.



  • Danke!


Anmelden zum Antworten