使用數組和指針時,了解類型衰減如何發生非常重要。雖然您可能期望二維數組退化為雙指針,但情況並非總是如此。讓我們深入研究為什麼會發生這種情況,並探索行為上的差異。
如測試案例所示,一維數組確實衰變成單一指標:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
這是因為可以使用單一指標執行指針算術。
但是,二維數組不會衰變為雙指針:
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
原因是雙指針需要有關數組維度的附加信息。例如,在 int[5][4] 的情況下,編譯器知道每個「內部」陣列的長度為 4。轉換為 int (*)[4] 會保留此訊息,從而使指針算術成為可能。
但是,轉換為 int ** 會遺失此維度資訊。它只是一個指向指針的指針,這不足以執行有意義的指針算術。
考慮以下內容:
<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>
這段程式碼手動執行數組訪問,表示編譯器依賴維度資訊。 int** 不提供此信息,因此不適合指針算術。
雖然一維數組會衰減為單指針,但多維數組不會衰減為雙指針因為他們缺乏必要的尺寸信息。此行為確保使用單一維度指標仍可進行有意義的指標算術。
以上是為什麼多維數組衰減到指標的方式與單維數組不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!