Array als Parameter



  • Ich habe eine Frage zu Arrays als Parameter, als Beispiel dazu eine einfache Funktion:

    void swap(int arr[]) {

    cout << arr[3] << endl;
    cout << sizeof(arr) << endl;
    int size = sizeof(arr) / sizeof(arr[0]);
    int temp = arr[size - 1];
    arr[size - 1] = arr[0];
    arr[0] = temp;
    }

    Wenn man die Funktion mit z.B. int test[4]={.....} und swap(test) aufruft, wird bei cout << sizeof(arr) << endl; immer nur 4 ausgegeben, bei cout << arr[3] << endl; aber schon das dritte Element, weswegen ja schon "alles" vom Array da ist. Ist es nicht möglich über diesen Weg innerhalb der Funktion die Größe des Arrays zu bestimmen, oder ist irgendwo ein grober Fehler drin?

    Viele Grüße,
    Erano1


  • Mod

    Das hier:

    void swap(int arr[])
    

    Das arr mag zwar so aussehen wie ein Array, ist es aber nicht. Es ist ein Zeiger. Womit sich deine sämtlichen Fragen von alleine beantworten sollten. Wenn du das kapiert hast, dann hast du einen der wichtigsten Fallstricke in C verstanden. In C++ würde man jedoch ein Iteratorenpaar an die Funktion übergeben, wodurch siche diese Fragen gar nicht erst stellen. Oder, wenn man sich absolut 100% sicher ist, dass ein Funktionsparameter wirklich ein Array sein muss (was eher unwahrscheinlich ist), dann eben ein std::array. Und dynamisch große Arrays sind in C++ sowieso std::vector. Hinter den Kulissen mag dabei zwar das gleiche geschehen wie in C, aber man hat deutlich weniger Gelegenheit, über versteckte Fallstricke zu fallen.



  • Vielen Dank,

    hat klick gemacht. Wäre das selbe als wenn ich int *ptr=test mache und dann sizeof(ptr), bekomme bloß die Größe des Pointer. Also am besten, wenn es ein Array als Parameter sein soll die Größe mit als Parameter übergeben oder mit wahrscheinlich noch besser mit vector arbeiten?

    Viele Grüße,
    Erano1


  • Mod

    Ja zu beiden Fragen.

    edit: Oder um ein bisschen weiter auszuholen: Orientier dich im Zweifelsfall an der Standardbibliothek. Da wirst du sehen, wird die überwiegende Zahl der Funktionen, die ein Array verarbeiten könnten stattdessen mit einem Iteratorpaar gefüttert, was ich ja auch schon erwähnt hatte. Denn in den allermeisten Fällen braucht man nur die Eigenschaft, dass die Daten in irgendeiner Form durchgehbar sind und einen klar definierten Anfang und Ende haben. Was auf Arrays zutrifft, aber auch auf allerlei andere Strukturen, und es gibt keinen Grund, sich einzuschränken.

    Die Fälle, in denen in der Standardbibliothek tatsächlich Arrays an Funktionen übergeben werden, sind hingegen sehr wenige (Jedenfalls außerhalb der C-Bibliothek, die ein Teil der C++-Bibliothek ist). Die allermeisten davon sind Fälle, bei denen man bewusst Ähnlichkeit zur C-Bibliothek herstellen wollte.


Log in to reply