Ich bin verwirrt darüber, wie man ein dynamisch definiertes Array erstellt:
int *array = new int[n];
Ich habe keine Ahnung, was das macht. Ich kann erkennen, dass es ein Zeiger namens Array erstellt, das auf ein neues Objekt/Array Int zeigt. Möchte jemand etwas erklären?
new weist eine Menge Speicherplatz zu, die zum Speichern des angeforderten Objekts/Arrays erforderlich ist. In diesem Fall sind n Zahlen von int.
Der Zeiger speichert dann die Adresse in diesem Speicherblock.
Aber seien Sie vorsichtig, dieser zugewiesene Speicherblock wird erst dann freigegeben, wenn Sie dies durch Schreiben mitteilen
delete [] array;
int *array = new int[n];
Es deklariert einen Zeiger auf ein dynamisches Array des Typs int
und der Größe n
.
Eine etwas detailliertere Antwort: new
weist Speicher mit der Größe sizeof(int) * n
Bytes zu und gibt den Speicher zurück, der in der Variablen array
gespeichert ist. Da der Speicher dynamisch mit new
zugewiesen wird, müssen Sie ihn manuell freigeben, indem Sie schreiben (wenn Sie dies nicht mehr benötigen):
delete []array;
Andernfalls verliert Ihr Programm mindestens sizeof(int) * n
Bytes (möglicherweise mehr, je nach der von der Implementierung verwendeten Zuordnungsstrategie).
Die Anweisung führt im Wesentlichen Folgendes aus:
Es reserviert Speicherplatz auf dem Heap gleich einem Integer-Array der Größe N, Und gibt einen Zeiger darauf zurück, der dem Int * -Typ-Zeiger namens "Array" zugewiesen wird
Es ordnet so viel Platz entsprechend dem Wert von n zu und der Zeiger zeigt auf das Array, d. H. Das erste Element des Arrays
int *array = new int[n];
In C/C++ sind Zeiger und Arrays (fast) gleichwertig. int *a; a[0];
gibt *a
und a[1];
gibt *(a + 1)
zurück
Aber das Array kann den Zeiger, auf den es zeigt, nicht ändern, solange der Zeiger dies kann.
new int[n]
reserviert einige Leerzeichen für das "Array"
Ab C++ 11 ist der speichersichere Weg, dies zu tun (immer noch mit einer ähnlichen Konstruktion), mit std::unique_ptr
:
std::unique_ptr<int[]> array(new int[n]);
Dadurch wird ein intelligenter Zeiger auf einen Speicherblock erstellt, der groß genug für n
-Ganzzahlen ist. Dieser wird automatisch gelöscht, wenn er den Gültigkeitsbereich verlässt. Diese automatische Bereinigung ist wichtig, da dadurch das Szenario vermieden wird, in dem Ihr Code vorzeitig beendet wird und Ihre delete [] array;
-Anweisung nie erreicht.
Eine andere (wahrscheinlich bevorzugte) Option wäre die Verwendung von std::vector
, wenn Sie ein Array benötigen, das für die dynamische Größenänderung geeignet ist. Dies ist gut, wenn Sie einen unbekannten Speicherplatz benötigen, es hat jedoch einige Nachteile (nicht konstante Zeit zum Hinzufügen/Löschen eines Elements). Sie können ein Array erstellen und Elemente hinzufügen, beispielsweise:
std::vector<int> array;
array.Push_back(1); // adds 1 to end of array
array.Push_back(2); // adds 2 to end of array
// array now contains elements [1, 2]