Pointer auf ein Array von Pointer
-
Hi
wie erstelle ich ein Pointer Array?
Habs so versucht, das funktioniert aber nicht?
ich möchte dann schon die einzelnen pointer stellen seperat mit new-erzeugen, wenn es dafür an der ezit ist.
aber es geht so gar nicht, was mach ih falsch#include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { int * p; p = new * p[3]; for (int i=0; i < 3; i++) p[i] = new int(3); for (int i=0; i < 3; i++) delete p[i]; return 0; }
-
Am enfachsten, Du baust Dir einen typedef.
#include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { typedef int* pint;//pint soll pointer to int heißen pint * p; p = new pint[3]; for (int i=0; i < 3; i++) p[i] = new int(3); for (int i=0; i < 3; i++) delete p[i]; return 0; }
-
volkard schrieb:
Am enfachsten, Du baust Dir einen typedef.
typedef int* pint;//pint soll pointer to int heißen
lol, den kommentar musst du überall hinschreiben wo du pint verwendest.
-
Du willst also Pointer in einem Array speichern,hab ich das richtig verstanden?
Wie wäre es mitstd::vector<int*> pointerVector;
-
@ FireFighter:
Irgendwie habe ich das Gefühl, er will zuerst die Grundlagen lernen...
Abgesehen davon finde ich Container, die besitzende Zeiger speichern, nicht schön, wenn man sich um deren Freigabe kümmern muss...
**
@ Hasokd:**
Zeiger sind grundsätzlich gleich zu handhaben wie die anderen Typen.Wenn du ein
int
-Array dynamisch auf dem Heap anlegst...int* ptr = new int[5]; delete[] ptr;
...kannst du das genauso gut mit Zeigern machen, also mit
int*
stattint
:int** ptr = new int*[5]; // <-- 5 Objekte vom Typ int* // ^ Zeiger auf diese Objekte muss also vom Typ int** sein. delete[] ptr;
Innerhalb kannst du dann jeden Eintrag - also jeden
int*
wiederum aufint
zeigen lassen:for (unsigned int i = 0; i < 5; ++i) // gehe alle Zeiger (int*) durch ptr[i] = new int(7); // <-- new fordert Speicher für einen int an und setzt dessen Wert auf 7. // ^ ptr[i] ist vom Typ int*, zeigt also auf int. for (unsigned int i = 0; i < 5; ++i) delete ptr[i]; // <-- gibt Speicher wieder frei
Es ist gut, wenn du das zur Übung machst, um das Verständnis von Zeigern und Speicherverwaltung zu vertiefen, aber lass dir gesagt sein, dass sowas in produktivem Code eher nicht vorkommt. Da nimmt man meistens komfortablere Alternativen wie den von FireFighter vorgeschlagenen
std::vector
. Hier gibts noch einen guten Artikel über Zeiger, der kann dir sicher auch helfen.
-
Nexus
Haste Recht, aber als ich das letzte mal direktboost::shared_ptr<T>
oder
boost::ptr_vector<T>
angebracht habe, hieß es gleich "Ahh kannste nicht machen, ist ja schlimm das ihr alle so faul werdet" Daher dachte ich mir hier, ich machst auf die std:: Variante
Noch besser sind natürlich die richtigen Grundlagen.
-
Nexus schrieb:
[cpp]int** ptr = new int*[4];
Danke für die Antworten soweit, das mir darum geht die Pointersache etwas besser zu verinnerlichen geh ich jeztt mal den Weg den man nicht gehen wurde :-).
wenn ich ein Array so wie oben erzeuge
und dann sage[cpp]
ptr[0] = new int(3);
ptr[1] = NULL;
ptr[2] = NULL;
ptr[3] = new int(1);
[/cpp]funktioniert dann das löschen so?
delete ptr[0]; delete ptr[3]; delete [] ptr;
-
Genau. Wobei du da auch delete auf die anderen ausführen darfst. Musst also for dem löschen nicht zuerst noch schauen, welche Elemente überhaupt etwas drin haben.
Einfach das Array am Anfang überall auf 0 setzen und du kannst mit einer Schleife löschen.