PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine Verständis Frage in C++



jancarsten
02-11-2005, 22:03
HI!

Kann mir mal jemand kurz erklären was bei dem Codeauschnitt genau gemacht wird? Es wird Speicher angefordert das ist mir klar. Aber wie genau? Müste "_zeilen" nicht "_spalten" sein und "_spalten" gleich "_zeilen"

In einem Buch habe ich gelesen, dass ein Mehrdimensionales Array so aufgebaut ist "foobar[zeilen][spalten]".



_zeilen=3;
_spalten=4;

int **mat;

/*schritt 1*/ mat = new int *[_zeilen];// das ist mir nicht so ganz klar. Reserviert der jetzt 3 int pointer bzw. Speicherplatz für diese 3 int pointer.
for(int j = 0; j < _zeilen ; j++){

/*Schritt 2*/ mat[j] = new int[_spalten];// das auch nicht

}



Vieleicht kann mir das ja jemand kurz erklären wie das Array nach Schritt 1 (aber vor Schritt 2) bzw. nach Schritt 2 aussieht

mfg jancarsten

P.S. Es wird Speicher angeforder für ein Matrix

panzi
02-11-2005, 22:35
_zeilen=3;
_spalten=4;

int **mat;

/*schritt 1*/ mat = new int *[_zeilen];// das ist mir nicht so ganz klar. Reserviert der jetzt 3 int pointer bzw. Speicherplatz für diese 3 int pointer.
// in der Tat, so ist es.
for(int j = 0; j < _zeilen ; j++){

/*Schritt 2*/ mat[j] = new int[_spalten];// das auch nicht
// hier wird jedem dieser 3 int-pointer eine gültige Adresse von hier allozierten Speicher zugewiesen
}



Vieleicht kann mir das ja jemand kurz erklären wie das Array nach Schritt 1 (aber vor Schritt 2) bzw. nach Schritt 2 aussieht

mfg jancarsten

P.S. Es wird Speicher angeforder für ein Matrix[/QUOTE]

Detrius
02-11-2005, 22:48
In einem Buch habe ich gelesen, dass ein Mehrdimensionales Array so aufgebaut ist "foobar[zeilen][spalten]".
Die Reihenfolge ist egal, Du musst später nur entsprechend darauf zugreifen. :)


/*schritt 1*/ mat = new int *[_zeilen];
Hier wird ein Array mit 3 Elementen vom Typ int* erzeugt. Du hast danach also ein Feld in dem 3 Zeiger sind, die auf einen int zeigen.


mat[j] = new int[_spalten];
Hier wird ein neues Array mit 4 Elementen vom Typ int angelegt. mat[j] zeigt nun auf dieses neue Feld.


Falls Du Dich noch nicht so mit C-Arrays und Pointern auskennst:
int foo[3]; // array mit 3 ints
int *bar = foo; // bar ist ein Pointer vom Typ int der auf das erste Element vom Array foo zeigt
bar = foo + 1; // jetzt zeigt bar auf das zweite Element von foo. Insbesondere gilt auch *(foo + 1) == foo[1]


Im Prinzip sind Arrays in C und C++ einfach ein Stück Speicher und der Name des Arrays zeigt auf den Anfang dieses Speichers. Durch den Typ des Arrays ist bekannt, wieviel Speicher jedes Element belegt und daher auch wo jedes Element liegt.

Bei einem 2D-Array legst Du nun zuerst ein Array mit lauter Pointern an, die jeweils auf ein eigenes Array zeigen. Dadurch kann man wie in Deinem Beispiel Matrizen abbilden. Allerdings müssen die Arrays nicht notwendigerweise gleich groß sein. Man kann allerdings auch jedes Zeile unterschiedlich lang machen, wenn man möchte.

jancarsten
02-11-2005, 23:08
Man dankt. So jetzt bin ich wider ein wenig schlauer :D