Typzerfall in mehrdimensionalen Arrays
In C unterliegen Arrays in bestimmten Kontexten einem Typzerfall in Zeiger. Das Verhalten unterscheidet sich jedoch für eindimensionale Arrays und mehrdimensionale Arrays. Warum ist das so?
Eindimensionale Arrays
Betrachten Sie den folgenden Code:
<code class="cpp">int[] arr = {1, 2, 3};</code>
Typzerfall konvertiert int[] in int *, sodass wir schreiben können:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
Das liegt daran, dass int[] effektiv in einen Zeiger auf das erste Element des Arrays zerfällt.
Mehrdimensionale Arrays
Dieses Verhalten gilt jedoch nicht für mehrdimensionale Arrays. Bedenken Sie:
<code class="cpp">int[][1] arr2 = {{1}, {2}, {3}};</code>
Der Typzerfall konvertiert int[][1] nicht in int**. Stattdessen bleibt es int[][1], was ein Zeiger auf ein Array der Größe 1 ist. Dies liegt daran, dass die Durchführung einer Zeigerarithmetik für ein mehrdimensionales Array aufgrund seines nicht zusammenhängenden Speicherlayouts unpraktisch wäre.
Zeiger auf Arrays
Um den gewünschten Zeigertyp für mehrdimensionale Arrays zu erhalten, müssen wir Zeiger auf Arrays erstellen. Bedenken Sie:
<code class="cpp">int*[] arr3 = {arr, arr2};</code>
Dies zerfällt in:
<code class="cpp">int**</code>
Dies liegt daran, dass int*[] in int** zerfällt, da die erste Dimension ein Zeiger und die zweite Dimension ein ist Array.
Auswirkungen
Das Verständnis dieses Verhaltens ist entscheidend für die Übergabe mehrdimensionaler Arrays als Funktionsargumente. Funktionen, die Zeiger auf Zeiger erwarten, können selbst keine mehrdimensionalen Arrays akzeptieren, sie können jedoch Zeiger auf Arrays akzeptieren, die bei der Parameterübergabe in Zeiger auf Zeiger zerfallen. Diese subtile Unterscheidung stellt sicher, dass die Zeigerarithmetik konsistent ist und Fehler beim Speicherzugriff verhindert.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich der Typzerfall für eindimensionale und mehrdimensionale Arrays in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!