Bei der Arbeit mit Arrays und Zeigern ist es wichtig zu verstehen, wie Typzerfall auftritt . Während Sie erwarten können, dass zweidimensionale Arrays in Doppelzeiger zerfallen, ist dies nicht immer der Fall. Lassen Sie uns untersuchen, warum dies geschieht, und den Unterschied im Verhalten untersuchen.
Wie der Testfall zeigt, zerfallen eindimensionale Arrays tatsächlich in einzelne Zeiger:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
Dies liegt daran, dass Zeigerarithmetik mit einem einzelnen Zeiger durchgeführt werden kann.
Zweidimensionale Arrays zerfallen jedoch nicht in Doppelzeiger :
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
Der Grund dafür ist, dass Doppelzeiger zusätzliche Informationen über die Abmessungen des Arrays erfordern. Im Fall von int[5][4] weiß der Compiler beispielsweise, dass jedes „innere“ Array eine Länge von 4 hat. Bei der Umwandlung in int (*)[4] bleiben diese Informationen erhalten, wodurch Zeigerarithmetik möglich wird.
Bei der Umwandlung in int ** gehen diese Dimensionsinformationen jedoch verloren. Es wird einfach ein Zeiger auf einen Zeiger, was nicht ausreicht, um eine sinnvolle Zeigerarithmetik durchzuführen.
Bedenken Sie Folgendes:
<code class="cpp">char *tmp = (char *)p // Work in units of bytes (char) + i * sizeof(int[4]) // Offset for outer dimension (int[4] is a type) + j * sizeof(int); // Offset for inner dimension int a = *(int *)tmp; // Back to the contained type, and dereference</code>
Dieser Code führt den Array-Zugriff manuell durch und zeigt damit, dass der Compiler auf Dimensionsinformationen angewiesen ist. int** stellt diese Informationen nicht bereit und ist daher für die Zeigerarithmetik ungeeignet.
Während eindimensionale Arrays in Einzelzeiger zerfallen, zerfallen mehrdimensionale Arrays nicht in Doppelzeiger weil ihnen die notwendigen Dimensionsinformationen fehlen. Dieses Verhalten stellt sicher, dass eine sinnvolle Zeigerarithmetik auch bei eindimensionalen Zeigern möglich bleibt.
Das obige ist der detaillierte Inhalt vonWarum zerfallen mehrdimensionale Arrays anders in Zeiger als eindimensionale Arrays?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!