Wie deklariere ich ein 2d-Array mit new?
Bei einer "normalen" Anordnung würde ich das tun:
int* ary = new int[Size]
mais
int** ary = new int[sizeY][sizeX]
a) nicht funktioniert/kompiliert und b) nichts bewirkt:
int ary[sizeY][sizeX]
tut.
Wie deklariere ich ein 2d-Array mit new?
Bei einer "normalen" Anordnung würde ich das tun:
int* ary = new int[Size]
mais
int** ary = new int[sizeY][sizeX]
a) nicht funktioniert/kompiliert und b) nichts bewirkt:
int ary[sizeY][sizeX]
tut.
2D-Array dynamisch deklarieren:
#include<iostream>
using namespace std;
int main()
{
int x = 3, y = 3;
int **ptr = new int *[x];
for(int i = 0; i<y; i++)
{
ptr[i] = new int[y];
}
srand(time(0));
for(int j = 0; j<x; j++)
{
for(int k = 0; k<y; k++)
{
int a = rand()%10;
ptr[j][k] = a;
cout<<ptr[j][k]<<" ";
}
cout<<endl;
}
}
Im obigen Code haben wir einen Doppelzeiger genommen und ihm einen dynamischen Speicher zugewiesen und einen Wert für die Spalten angegeben. Hier ist der zugewiesene Speicher nur für die Spalten, jetzt für die Zeilen brauchen wir nur eine for-Schleife und weisen den Wert für jede Zeile einen dynamischen Speicher zu. Jetzt können wir den Zeiger so verwenden, wie wir ein 2D-Array verwenden. Im obigen Beispiel haben wir dann unserem 2D-Array (Zeiger) Zufallszahlen zugewiesen. Es geht um DMA von 2D-Arrays.
Ich würde vorschlagen, 2D-Vektoren statt 2D-Arrays zu verwenden. Grundsätzlich mit Vektoren so viel wie möglich vor allem, weil
Hier ist ein kleiner Codeschnipsel, mit dem Sie ein Array mit dynamischer Größe erstellen können
vector<vector<int>> arr;
for (int i=0; i<n; i++)
{
vector<int> temp;
for (int j=0; j<k; j++)
{
int val;
//assign values
temp.push_back(val);
}
arr.push_back(temp);
}
Ich verwende dies bei der Erstellung eines dynamischen Arrays. Wenn Sie eine Klasse oder eine Struktur haben. Und das funktioniert. Beispiel:
struct Sprite {
int x;
};
int main () {
int num = 50;
Sprite **spritearray;//a pointer to a pointer to an object from the Sprite class
spritearray = new Sprite *[num];
for (int n = 0; n < num; n++) {
spritearray[n] = new Sprite;
spritearray->x = n * 3;
}
//delete from random position
for (int n = 0; n < num; n++) {
if (spritearray[n]->x < 0) {
delete spritearray[n];
spritearray[n] = NULL;
}
}
//delete the array
for (int n = 0; n < num; n++) {
if (spritearray[n] != NULL){
delete spritearray[n];
spritearray[n] = NULL;
}
}
delete []spritearray;
spritearray = NULL;
return 0;
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
74 Stimmen
Es funktioniert nur, wenn sizeX konstant ist: int(*ary)[sizeX] = new int[sizeY][sizeX]; Das ist der richtige Weg, um einen int[sizeY][sizeX] zu erstellen, bei dem der gesamte Speicher zusammenhängend ist. (Ich glaube nicht, dass dies eine Antwort wert ist, da wahrscheinlich Ihre sizeX nicht konstant ist
36 Stimmen
Ich kann nicht glauben, dass all die Dutzende von Antworten unten sind todos falsch und beantwortet die Frage nicht, und dennoch werden sie alle hochgestuft. Der obige Kommentar von Johanes Shaub ist die einzig richtige Antwort auf die Frage . Ein 2D-Array und ein Array mit Zeigern auf ein Array sind zwei völlig verschiedene Dinge, die offenbar jeder verwechselt.
8 Stimmen
@JohannesSchaub-litb: Das ist nicht 100%ig richtig. Sicherlich funktioniert es in diesem Fall, aber es gibt eine Methode, mit der es funktioniert, wenn alle Dimensionen variieren, siehe stackoverflow.com/a/29375830/103167