Array mit x Elementen



  • Hallo,
    ich möchte ein Array machen, das x elemente enthält. x wird vom Benutzer mit cin eingelesen.
    Ich weis auch dass ich beim Array eine Constante brauch. Weis jemand wie das geht?

    P.s. bin c++ neuling(heut mein erster Tag, also entschuldigt solche newbee Fragen.)



  • Hi,

    was du suchst, ist dynamischer Speicher. Das geht z. B. so:

    int   AnzahlElemente;
    int   *MyArray;
    
        std::cout <<"Anzahl Elemente: ";
        std::cin  >> AnzahlElemente;
    
        MyArray = new int[AnzahlElemente]; //speicher fuer 'AnzahlElemente'-Elemente reserviert
        //...mache was mit MyArray
        delete [] MyArray; //speicher wieder freigeben
    

    Etwas eleganter ist es aber mit std::vector<>, dann musst du dich nicht um den Speicher
    kuemmern. Kleines Beispiel:

    #include <vector>
    
    int  Element;
    std::vector<int> Elemente;
    
         while ( cin >> Element )
         {
              if ( Element == 0 ) //irgend ne abbruchbedingung, ist ja nur en beispiel
                   break;
              Elemente.push_back ( Element ); //eingegebenes element in vector speichern
         }
    
         //alle elemente ausgeben; mit dem iterator koennen wir uns elementweise duch den vector
         //bewegen. zugriff auf ein element via *It
         std::vector<int>::const_iterator It = Elemente.begin();
         for ( ; It != Elemente.end(); ++It )
             std::cout << *It <<" ";
    

    Hoffe ich konnte dir einwenig helfen.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Hi,

    was du suchst, ist dynamischer Speicher. Das geht z. B. so:

    int   AnzahlElemente;
    int   *MyArray;
        
        std::cout <<"Anzahl Elemente: ";
        std::cin  >> AnzahlElemente;
    
        MyArray = new int[AnzahlElemente]; //speicher fuer 'AnzahlElemente'-Elemente reserviert
        //...mache was mit MyArray
        delete [] MyArray; //speicher wieder freigeben
    

    Sehr interessant, aber warum ist MyArry ein pointer ? Ich bin auch realtiv neu in C++-Programmierung und das mit den Zeigern versteh ich irgendwie überhaupt nicht.



  • also dort wurde ein pointer benutzt, da man ja zu beginn nicht unbedingt weiss wie gross das array sein soll. daher hält man sich dessen grösse noch offen und allokiert erst nachdem das klar ist entsprechend viel speicherplatz.

    und nun eine kleine einführung in die welt der pointer ...
    ein pointer zeigt auf einen reservierten speicherbereich bzw. ist NULL (auch oft einfach 0 geschrieben).
    dieser speicherbereich sollte ein ganzes vielfaches (>0) von der grösse des pointertypes sein. also bei einem 32-bit integer ein vielfaches von 4 byte.
    diesen speicherbereich allokiert man normalerweise mit 'new'.
    man kann nun mit 'new int' den speicherplatz für genau 1 integer zuweisen, mit 'new int[n]' weist man den speicherplatz für n integer zu.
    freigeben MUSS man diese speicherbereiche wieder mit 'delete ein_integer' bzw. mit 'delete [] viele_integer'.
    beim zugriff auf den INHALT eines pointers (hier mal kurz mit int * p definiert) gibt es verschiedene methoden:
    1. int a=*p;
    2. int a=p[0];

    als wichtigen hinweis solltest du noch beachten, dass bei diesen pointern keine prüfung stattfindet ob den reservierten speicherbereich nicht aus versehen verlässt. man kann also bei folgender definition 'int *p=new int[2]' einfach 'int a=p[1000]' schreiben. da du doch in irgendwelche anderen speicherbereiche schreibst die evtl. elementar wichtig für die steuerung des programmes sind schreibst, darf man sich dann nicht über unerklärliches verhalten oder abstürze wundern. etwas ähnliches passiert ja beim bufferoverflow auch.

    so ich hoffe ich konnte es etwas näherbringen.
    wenn nicht -> faq und google benutzen.



  • Nochmal zur Verdeutlichung:

    Nehmen wir mal an wir haben 2 int (int a[2]) hintereinander im Speicher und einen int-Pointer (int* p = &a[1]) der auf das Erste Element zeigt...

    p
    [0][1][2][3][4][5][6][7][8][9][10][11]
    

    Der Inhalt von p (im Code *p) ist ein int, also gehören die ersten 4 Bytes (32 Bit Integer) zusammen.

    -----*p-----
    [0][1][2][3][4][5][6][7][8][9][10]
    

    Jetzt will ich aber auch den zweiten Wert in dem Array auslesen. Wenn ich sage ++p wird p um so sizeof(int) Bytes nach vorne verschoben... Wir sehen also nun den Inhalt von p (*p), den Inhalt von ++p (*(p+1)) und p markiert...

    -----*p----|---*(p+1)--|
    [0][1][2][3][4][5][6][7][8][9][10]
                 p
    

    Hoffe das war einigermaßen einleuchtend. Ansonsten FAQ oder googlen nach Tutorials.


Anmelden zum Antworten