it-swarm.com.de

Einen Zeiger auf ein mehrdimensionales Array deklarieren und das Array zuordnen

Ich habe es versucht zu suchen, aber ich habe nichts mit einer definitiven Antwort gefunden. Ich weiß, dass mein Problem nicht so schwer sein kann. Vielleicht bin ich nur müde ..

Grundsätzlich möchte ich einen Zeiger auf ein zweidimensionales Array deklarieren. Ich möchte es auf diese Weise machen, weil ich die Größe des Arrays ändern muss. Ich habe folgendes erfolgreich mit einem 1D-Array gemacht:

int* array;
array = new int[somelength];

Ich möchte folgendes mit einem 2D-Array machen, aber es wird nicht kompiliert:

int* array;
array = new int[someheight][somewidth];

Der Compiler gibt einen Fehler aus, der besagt, dass "irgendwo" nicht in einem Konstantenausdruck erscheinen darf. Ich habe alle möglichen Kombinationen von ** und [] [] ausprobiert, aber keine davon scheint zu funktionieren. Ich weiß, dass das nicht so kompliziert ist ... Jede Hilfe wird geschätzt.

21
vince88

Ich habe gerade festgestellt, dass diese alte Antwort immer noch gelesen wird, was schade ist, da sie falsch ist. Schauen Sie sich die Antwort unten mit allen Stimmen an.


Wenn Sie sich mit der Zeigersyntax vertraut machen, benötigen Sie ein Array von Arrays. Welches ist das gleiche wie ein Zeiger auf einen Zeiger.

int width = 5;
int height = 5;
int** arr = new int*[width];
for(int i = 0; i < width; ++i)
   arr[i] = new int[height];
13
dutt
const int someheight = 3;
 const int somewidth = 5;

 int (*array)[somewidth] = new int[someheight][somewidth];
42
Tony The Lion

Ein gebrauchsfertiges Beispiel aus here , nach wenigen Sekunden googeln mit dem Satz "zweidimensionales dynamisches Array":

int **dynamicArray = 0;

// memory allocated for elements of rows. 
dynamicArray = new int *[ROWS];

// memory allocated for  elements of each column.  
for( int i = 0 ; i < ROWS ; i++ ) {
    dynamicArray[i] = new int[COLUMNS];
}

// free the allocated memory 
for( int i = 0 ; i < ROWS ; i++ ) {
    delete [] dynamicArray[i];
}
delete [] dynamicArray;
6
Arun

Ich empfehle eine weitaus einfachere Methode als ein Array von Arrays:

#define WIDTH 3
#define HEIGHT 4

int* array = new int[WIDTH*HEIGHT];
int x=1, y=2, cell;
cell = array[x+WIDTH*y];

Ich denke, dass dies ein besserer Ansatz als ein Array eines Arrays ist, da die Zuordnung viel geringer ist. Sie könnten sogar ein Hilfsmakro schreiben:

#define INDEX(x,y) ((x)+(WIDTH*(y)))

int cell = array[INDEX(2,3)];
4

Ich persönlich bevorzuge die Verwendung eines syntaktischen Tricks, um einen Zeiger auf das mehrdimensionale Array mit dynamischer Größe zu deklarieren. Dies funktioniert in Compilern, die Variable Length Arrays (VLAs) unterstützen, die alle C++ - Compiler und die meisten aktuellen C-Compiler verwenden sollten.

Die Grundidee ist hier eingefangen:

void bar (int *p, int nz, int ny, int nx) {
  int (*A)[ny][nx] = (int(*)[ny][nx]) p;

"p" zeigt auf den (zusammenhängenden) Raumblock, den Sie als mehrdimensionales Array behandeln möchten. "A" hat denselben Wert wie "p", aber die Deklaration behandelt den Compiler so, dass er Verweise auf "A" in der von Ihnen gewünschten mehrdimensionalen Weise behandelt.

#include <iostream>
using namespace std;

void bar (int *p, int nz, int ny, int nx)
{
  int (*A)[ny][nx] = (int(*)[ny][nx]) p;

  for (int ii = 0; ii < nz; ii++) {
    for (int jj = 0; jj < ny; jj++) {
      for(int kk = 0; kk < nx; kk++) {
          A[ii][jj][kk] = ii*1000000 + jj*1000 + kk;
      }
    }
  }
}


void out (int *p, int nz, int ny, int nx)
{
  int (*A)[ny][nx] = (int(*)[ny][nx]) p;
  cout << A[11][22][33] << endl;
}


int main (void)
{
  int NX = 97;
  int NY = 92;
  int NZ = 20;
  int *space = new int [NZ * NY * NX];

  bar (space, NZ, NY, NX);
  out (space, NZ, NY, NX);
  return 0;
}

Wenn Sie dies ausführen, wird die Ausgabe "11022033" erzeugt.

Die Deklaration des Alias ​​"A" sieht etwas komisch aus, ermöglicht jedoch die direkte und einfache Verwendung der gewünschten mehrdimensionalen Array-Syntax

2
Bron Nelson

Ich denke das wird reichen 

int r, c ;
std::cin>>r>>c ;
int *array = new int[r*c] ; 

Sie können die Werte eingeben, indem Sie Folgendes tun 

for (int i = 0 ; i < r ; i++){
    for (int j = 0 ; j < c ; j++){
        std::cin>>array[i *c + j] ; 
    }
}
1
Tasdik Rahman