多維數組中的類型衰減
在 C 中,數組在某些上下文中經歷類型衰減為指針。但是,一維數組和多維數組的行為有所不同。為什麼會這樣呢?
一維數組
考慮以下程式碼:
<code class="cpp">int[] arr = {1, 2, 3};</code>
型別衰減將int[] 轉換成int *,讓我們寫:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>這是因為int[] 實際上衰減為指向數組第一個元素的指標。
多維數組
但是,此行為不會擴展到多維數組。考慮:<code class="cpp">int[][1] arr2 = {{1}, {2}, {3}};</code>型別衰減不會將 int[][1] 轉換為 int**。相反,它仍然是 int[][1],它是一個指向大小為 1 的陣列的指標。這是因為,由於多維數組的記憶體佈局不連續,因此對其執行指標算術是不切實際的。
指向陣列的指標
為了得到多維陣列所需的指標類型,我們需要建立指向陣列的指標。考慮:<code class="cpp">int*[] arr3 = {arr, arr2};</code>這會衰減為:
<code class="cpp">int**</code>這是因為int*[] 衰減為int**,因為第一個維度是指針,第二個維度是array.
含義
理解這種行為對於將多維數組作為函數參數傳遞至關重要。需要指向指針的函數本身不能接受多維數組,但它們可以接受指向數組的指針,這些指針在參數傳遞期間會衰減為指向指針的指針。這種微妙的區別確保了指標算術的一致性並防止記憶體存取錯誤。以上是為什麼 C 中一維數組和多維數組的型別衰減不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!