643 Stimmen

Wie deklariere ich ein 2d-Array in C++ mit new?

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.

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

-1voto

user2808359 Punkte 41

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.

-1voto

Muhammed Imdaad Punkte 19

Ich würde vorschlagen, 2D-Vektoren statt 2D-Arrays zu verwenden. Grundsätzlich mit Vektoren so viel wie möglich vor allem, weil

  1. die dynamische Speicherzuweisung ist mühelos
  2. automatische Speicherverwaltung

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);
}

-1voto

Vivek Rai Punkte 9
int **arr = new int* [NoOfRows]
for(int i = 0; i<NoOfRows; i++)
   arr[i] = new int[noOfColumn];

Dies ist der beste Weg, um das 2D-Array in C++ zu deklarieren, indem man new Hier zeigt NoOfRow an, wie viele Zeilen Sie wollen und noOfColumn zeigt an, wie viele Spalten Sie haben möchten

-4voto

anyman Punkte 7

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.com

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.

Powered by:

X