Erstellen von arrays auf dem heap, und die Adressierung mit Pointer
Ich habe Probleme beim Verständnis der folgende code, die ich hoffte, würde erstellen Sie ein array auf dem heap, und füllen Sie es mit den Zeichen 9 bis 0 (ich weiß, ich könnte nur index das array wie eine normale stack-array mit [] - notation, um dies zu tun, aber ich mache es auf diese Weise zu versuchen zu verstehen, Zeiger in mehr Tiefe):
int *ptrHeapArray = new int[10];
for(int f=9; f>=0 ;f--)
{
*ptrHeapArray = f;
ptrHeapArray++;
}
for(int f=0; f<10; f++)
cout << ptrHeapArray[f] << "\n";
Druckt es aus compleletly unerwartete Werte.
So wie ich das verstehe, muss der 'neue' Befehl erstellt ein array auf dem heap, und schickt mir wieder ein Zeiger auf die Adresse, wo das array ist. Da der Zeiger, die ich zuordnen (ptrHeapArray) ist der int-Größe bin ich davon ausgegangen, ich könnte mit Zeiger-post-Inkrementierung zum navigieren durch das array. Jedoch deuten die Ergebnisse darauf hin, dass meine Annahmen falsch sind.
Dieser hat mir zu denken, dass vielleicht die übergebene Zeiger zurück durch die "neue" Schlüsselwort wird nur ein pointer auf das gesamte array und kann nicht verwendet werden, um Schritt für Schritt durch das array aus irgendeinem Grund.
Also ich habe versucht, erstellen Sie einen weiteren Zeiger auf den Zeiger zurückgegeben, die durch die "neue" Schlüsselwort, und verwendet, um zu tun, mein array Bevölkerung:
int *ptrHeapArray = new int[10]; //array to hold FRANK data in 32 bit chunks
int *ptrToHeapArrayPointer = ptrHeapArray;
for(int f=9; f>=0 ;f--)
{
*ptrToHeapArrayPointer = f;
ptrToHeapArrayPointer++;
}
for(int f=0; f<10; f++)
cout << ptrHeapArray[f] << "\n";
Dies funktionierte gut.
Kann jemand mir erklären, warum ich dies tun musste und konnte nicht einfach haben, verwendet das übergebene Zeiger gesichert, um mich von den "neuen" Schlüsselwort?
Dank
InformationsquelleAutor Columbo | 2009-06-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Linie
in der ersten for-Schleife inkrementiert den Zeiger, so dass es nicht auf den Anfang des Arrays mehr.
Die Linie
reserviert Speicher für 10 Integer-zahlen und Punkte ptrHeapArray zu Beginn, dass der Speicher. In deiner for-Schleife, die Sie dann bewegen Sie diesen Zeiger. Wenn ptrHeapArray Punkte, der Dritte der ganzen zahlen:
dann ptrHeapArray[2] geben Sie die ganze Zahl an der position, die gerade numerierten 4.
legen Sie es nicht auf diese Weise. Du bist nicht die Unterscheidung zwischen dem Zeiger und dem, was Sie zeigt. Dies ist eine Unterscheidung, die neue Programmierer oft schwer. "Der Kopf des Arrays" nicht verändern(überschrieben). Es ist unverändert. Es gibt einfach keine Zeiger mehr.
InformationsquelleAutor balpha
Den Sie ändern den Zeiger im code. Nach der ersten Schleife in die erste Schnipsel, der Zeiger auf das Ende des Arrays eher als der Anfang. Um die Dinge klarer, das würde auch funktionieren (nicht vorgeschlagen, sondern veranschaulicht das Verhalten):
InformationsquelleAutor Mehrdad Afshari
Ihre ptrToHeapArrayPointer ist irreführend, es ist einfach ein standard int ptr, Sie haben Spitzen an der gleichen Stelle wie ptrHeapArray. Wenn Sie benannte Sie um currentPositionPtr der code könnte mehr Sinn machen.
InformationsquelleAutor Patrick
Wenn Sie ptrHeapArray++ inscrements ptrHeapArray. Wenn Sie kommen, um drucken Sie die Daten ptrHeapArray nicht mehr Punkte zu Beginn der Reihe.
InformationsquelleAutor Tom Carter
Das problem ist, dass in deinem ersten Beispiel ptrHeapArray zunächst an den Anfang des Arrays. Wie Sie beim Durchlaufen der Schleife werden Sie Inkrementieren den pointer, und am Ende der for-Schleife, die Sie auf das Letzte element im array. Wenn du gehen Sie durch die for-Schleife, um alle Ihre Werte, die Sie indizieren, um Werte über das Ende des Arrays, da ptrHeapArray verweist auf das Letzte element in dem array zugeordnet.
Es ist auch wichtig, daran zu erinnern, dass Sie sollten wohl darauf achten, nicht zu Locker die original-Zeiger, der wieder von der Benutzung des new-operators, so dass Sie richtig frei zu den Speicher, der dem heap zugeordnet.
InformationsquelleAutor heavyd
In der ersten Schleife erhöht Sie den Mauszeiger
ptrHeapArray
bis zum Ende von array. Also nach der Ausführung der ersten for-Schleife den Zeiger auf Ende der Arrays und nicht am Anfang. Daher, wenn Sie zu drucken versuchen, den Inhalt des Arrays, der Zugriff auf ungültigen Speicher-Zuweisungen und das Verhalten wird unerwartet sein. Im zweiten Fall, nehmen Sie eine Kopie Ihrer Start-Adresse vor der Zuweisung von Werten in das array. Also, wenn Sie versuchen, drucken Sie den Inhalt mit dem kopieren, es zeigt auf den Anfang des Arrays.InformationsquelleAutor Naveen