referenz auf array übergeben?



  • also sagen wir ich habe einen array
    int mar[100];

    und jetzt möchte ich in einer funktion direkt in diesen array schreiben. wie mach ich das?

    void doit(int &*arr)
    {

    }
    ????

    ich komme mit verweisen, pointern und array immernoch durcheinander



  • Wenn du nur die Elemente in dem Array verändern willst, dann musst du da gar nichts mit Referenz übergeben, da ein Array auch nur ein konstanter Zeiger ist und das ja automatisch ein Aufruf "by reference" ist.



  • nep schrieb:

    Wenn du nur die Elemente in dem Array verändern willst, dann musst du da gar nichts mit Referenz übergeben, da ein Array auch nur ein konstanter Zeiger ist und das ja automatisch ein Aufruf "by reference" ist.

    nein. ich möchte elemente dem array hinzufügen.

    und zwar habe ich einen array von pointern auf objekte (also adressen) und erstelle in der funktion ein neues objekt, dessen pointer ich dem array hinzufügen möchte.



  • mein compiler bezeichnet einen verweis auf einen (40000elemente)array von pointern mit

    (__w64 )[40000]

    😞 😮



  • Hallo

    pixartist^2 schrieb:

    und zwar habe ich einen array von pointern auf objekte (also adressen) und erstelle in der funktion ein neues objekt, dessen pointer ich dem array hinzufügen möchte.

    Dann must du schon in die Speicherverwaltung eingreifen. Davon ausgehen das du statt statischen Arrays schon klassische dynamische Arrays verwendest, must du ein neues Array mit der vergrößerten Elementanzahl erstellen, alle Elemente kopieren und das alte Array löschen.
    (In C gibt es realloc, aber das darfst du nicht mit new/delete und nicht-POD-Elementen vermischen)

    Da das ganze sehr unschön ist gibt es in C++ std::vector, wo du dir um die Speicherwaltung keine Sorgen machen must.

    bis bald
    akari



  • akari schrieb:

    Hallo

    pixartist^2 schrieb:

    und zwar habe ich einen array von pointern auf objekte (also adressen) und erstelle in der funktion ein neues objekt, dessen pointer ich dem array hinzufügen möchte.

    Dann must du schon in die Speicherverwaltung eingreifen. Davon ausgehen das du statt statischen Arrays schon klassische dynamische Arrays verwendest, must du ein neues Array mit der vergrößerten Elementanzahl erstellen, alle Elemente kopieren und das alte Array löschen.
    (In C gibt es realloc, aber das darfst du nicht mit new/delete und nicht-POD-Elementen vermischen)

    Da das ganze sehr unschön ist gibt es in C++ std::vector, wo du dir um die Speicherwaltung keine Sorgen machen must.

    bis bald
    akari

    nein nein nein, ich hab mich ungenau ausgedrückt. ich möchte den array nicht vegrößern! platz ist genug! ich möchte ihn füllen!



  • Hallo

    Und wo ist dann das Problem? 😕
    Wie nep bereits gesagt hat werden Arrays bereits By-Referenz übergeben. Wenn du eine feste Arraygröße hast kannst du schreiben

    void func(int array[10])
    {
      array[3] = 3; // Wert wird im echten Array des Aufrufers geändert, da keine Kopie gemacht wird
    }
    

    Wenn du hingegen eine variable Größe hast übergibst du als Pointer

    void func(int* array)
    {
      array[3] = 3; // Wert wird im echten Array des Aufrufers geändert, da keine Kopie gemacht wird
    }
    

    bis bald
    akari



  • pixartist^2 schrieb:

    also sagen wir ich habe einen array
    int mar[100];

    und jetzt möchte ich in einer funktion direkt in diesen array schreiben. wie mach ich das?

    Dazu solltest Du unbedingt die Länge des Arrays mit übergeben!

    void doit(size_t const size, int * const array) {
        // Code
    }
    

    Aber das ganze ist nicht wirklich schön. Es gibt andere Möglichkeiten das Problem besser zu lösen.


  • Mod

    akari schrieb:

    Hallo

    Und wo ist dann das Problem? 😕
    Wie nep bereits gesagt hat werden Arrays bereits By-Referenz übergeben. Wenn du eine feste Arraygröße hast kannst du schreiben

    void func(int array[10])
    {
      array[3] = 3; // Wert wird im echten Array des Aufrufers geändert, da keine Kopie gemacht wird
    }
    

    Wenn du hingegen eine variable Größe hast übergibst du als Pointer

    void func(int* array)
    {
      array[3] = 3; // Wert wird im echten Array des Aufrufers geändert, da keine Kopie gemacht wird
    }
    

    bis bald
    akari

    Es ist egal, wie die Deklaration lautet:

    void func(int array[10]);
    void func(int* array);
    

    Deklarieren beide ein und dieselbe Funktion, welche einen Zeiger auf ein int als Parameter erwartet. Folglich ist auch im Falle der ersten Deklaration die Größe des Arrays nicht Teil der Funktionssignatur und daher innerhalb der Funktion unbekannt. Es ist absolut möglich und zulässig, ein Array anderer Größe zu übergeben.

    Eine Übergabe per Referenz muss auch so deklariert werden:

    void func(int (&array)[10]);
    

    Hier ist array innerhalb der Funktion tatsächlich ein Array und nicht nur ein Zeiger.


Anmelden zum Antworten