Umwandlung von 2D-array-Zeiger-zu-Zeiger
Activity solution[a][b];
...
Activity **mother = solution;
Ich möchte konvertieren von 2D-array-Objekte-Zeiger-zu-Zeiger. Wie kann ich dies tun;
Suchte ich es auf google. aber ich fand nur eine dimension array-Beispiel.
InformationsquelleAutor Bahri Gökcan | 2011-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer bloßen Konvertierung wird Ihnen nicht helfen hier. Es gibt keine Kompatibilität jeglicher Art zwischen 2D-array-Typ und pointer-to-pointer-Typ. Eine solche Umwandlung würde keinen Sinn machen.
Wenn Sie wirklich, wirklich tun müssen, Sie haben, um einzuführen, eine zusätzliche intermediate "row-index" - array, die die Lücke zwischen 2D-array-Semantik und Zeiger-auf-Zeiger Semantik
Nun Zugriff auf
mother[i][j]
erhalten Sie Zugriff aufsolution[i][j]
.InformationsquelleAutor
Der Grund, Sie können dies tun, für eindimensionale arrays und nicht zwei-dimensionalen arrays zu tun hat mit der Art und Weise, in der der eigentliche array-Elemente im Speicher gespeichert werden. Für eindimensionale arrays, die alle Elemente gespeichert sind, nacheinander, so dass die expression
array[i]
ist äquivalent zu dem Ausdruck*(array + i)
. Wie Sie sehen können, ist die array-Größe ist nicht notwendig zur Durchführung einer array-index operation. Jedoch, für zwei-dimensionale arrays, die Elemente, die gespeichert werden in der "row-major" Ordnung, was bedeutet, dass alle Elemente der nullten Zeile gespeichert sind, an Erster Stelle, gefolgt von den Elementen in der ersten Zeile, gefolgt von den Elementen in der zweiten Zeile, etc. Daher ist der Ausdruckarray[i][j]
entspricht*(array + (i * ROW_SIZE) + j)
, woROW_SIZE
ist die Anzahl der Elemente in jeder Zeile. Deshalb wird auch der array - Zeile, die Größe, die erforderlich ist, um einen array-index operation, und Gießen Sie die array-variable ein Zeiger verliert die Informationen.InformationsquelleAutor
Warum? Ist es denn ein interface erwartet eine Zeiger auf Zeiger?
Wenn das so ist, müssen Sie erstellen ein neues array enthält die Zeiger.
Warum können Sie nicht einfach werfen ein 2D-array von
T
zuT**
? Gut, denn Sie haben nichts mit einander zu tun!Können Sie werfen einen
T[a]
zu einemT*
weil Sie einen Zeiger auf das erste element des Arrays.Können Sie dies mit 2D-arrays, wenn du aber eine
T[a][b]
dann es zerfällt zu einem(T[b])*
weil ein 2D-array ist kein array von Pointern, es ist ein array von arrays.Sollte dies nicht der Linie
solutionPtrs[a] = solution[a];
werdensolutionPtrs[i] = solution[ i];
InformationsquelleAutor
Dies ist c++! Alles ist möglich! Aber dies ist c++ so Bedarf es einem gewissen Maß an Verständnis.
Zu diesem Zweck beginnen wir mit einem einfachen Beispiel 2 1-dimensionale arrays:
char firstName[4] = { 'J', 'o', 'n', '\0' }
undchar lastName[4] = { 'M', 'e', 'e', '\0' }
schauen wir uns eine mögliche memory layout hier:Angesichts dieser Speicher-layout, wenn Sie waren zu tun
cout << firstName << ' ' << lastName
Sie bekommen würde:Diese arrays sind eigentlich nur ein Zeiger auf Ihr erstes element! Dies verdeutlicht Array-Pointer-Decay -, Sie können mehr über Sie hier: http://en.cppreference.com/w/cpp/language/array#Array-to-pointer_decay
Bevor wir fortfahren, gibt es etwas wichtiges hier zu beachten,
char
s dauern, bis genau 1 byte, also die Adresse des nachfolgendenchar
im array werden einfach die nächste Adresse. Dass die Nutzung durch die Subskript-Operator in dieser Weise:firstName[1]
entspricht*(firstName + 1)
. Dies gilt fürchar
s, aber gilt auch für jede andere Art, die mehr als 1 byte. Nehmen wir als Beispiel:short siArray = { 1, 2, 3, 4 }
, ein mögliches speicherlayoutsiArray
würde wie folgt Aussehen:Obwohl
cout << siArray << ' ' << &(siArray[1])
Ausgabe:*(siArray + 1)
noch index das gleiche element vonsiArray
alssiArray[1]
. Dies ist, weil, wenn Sie tun, Zeiger-Arithmetik c++ hält der Typ der Adresse, die auf betrieben, so Inkrementieren einesshort*
wird tatsächlich erhöhen die Adresse vonsizeof(short)
. Lesen Sie mehr über Zeiger-Arithmetik hier: http://en.cppreference.com/w/cpp/language/operator_arithmeticSchließlich schauen wir, wie die c++ speichert 2-dimensionale arrays. Gegeben:
char name[2][4] = { { 'J', 'o', 'n', '\0' }, { 'M', 'e', 'e', '\0' } }
eine mögliche memory layout wäre:Da wir wissen, dass ein 1-dimensionales array-Wert ist wirklich nur ein Zeiger ist, können wir sehen, aus diesem Speicher-layout, das
name[0]
ist nicht einen Zeiger, es ist nur das erste Zeichen des ersten Arrays. Soname
nicht enthalten 2 1-dimensionales array von Zeigern, sondern enthält den Inhalt von 2 arrays. (Übrigens auf einem 32-bit-Maschine nicht die Speicherung der Zeiger speichert 8-Byte Speicher, was ganz wesentlich für eine 8-byte 2-dimensionales array.) So versuchen, zu behandelnname
alschar**
würde versuchen, die Zeichen als Zeiger.Verstanden zu haben, das wir wirklich brauchen nur zu vermeiden, mit c++'s Zeiger-Arithmetik zu finden dereferenzieren den Wert. Zu tun, dass wir arbeiten müssen, mit einem
char*
so, dass die Zugabe von 1 ist eigentlich nur das hinzufügen von 1. So zum Beispiel:Live Beispiel
Beachten Sie, dass in diesem Beispiel, obwohl ich mich auf
si2DArray
dachtepsi2DPointer
ich bin immer noch mit Informationen aussi2DArray
zu tun, die Indizierung, nämlich:size(si2DArray)
size(*si2DArray)
sizeof(*si2DArray)
sizeof(**si2DArray)
Sie können also sehen, dass der Verlust von Informationen, die aus der Umwandlung von einem array zu einem Zeiger ist beträchtlich. Sie könnten versucht sein, erhalten Sie den element-Typ, und damit auch die Vereinfachung der Zeiger-Arithmetik. Es lohnt sich, zu beachten, dass nur eine Umstellung auf
char*
ist definiert als Verhalten vonreinterpret_cast
: http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasingInformationsquelleAutor
Können Sie nicht. Sie sind grundsätzlich verschiedene Typen.
Wenn Sie mehr detail auf, was Sie tun möchten, mit
mother
, dann kann ich Ihnen einen Vorschlag in meiner Antwort.InformationsquelleAutor
Nicht sicher, ob du für so etwas suchen. Sollten Sie mehr details über das, was Sie erreichen wollen. Sie sind grundsätzlich verschiedene Typen. Eine Lösung ist weiter unten.
Für die Aufzeichnung, wenn jemand findet es nützlich:
InformationsquelleAutor