Heim  >  Artikel  >  Backend-Entwicklung  >  Warum zerfallen mehrdimensionale Arrays anders in Zeiger als eindimensionale Arrays?

Warum zerfallen mehrdimensionale Arrays anders in Zeiger als eindimensionale Arrays?

DDD
DDDOriginal
2024-10-26 08:24:03564Durchsuche

 Why Do Multidimensional Arrays Decay to Pointers Differently Than Single-Dimensional Arrays?

Warum Arrays je nach Dimensionalität unterschiedlich in Zeiger zerfallen

Einführung

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.

Zerfall für eindimensionale Arrays

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.

Zerfall für mehrdimensionale Arrays

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.

Den Unterschied verstehen

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.

Fazit

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn