2012-01-27 31 views
-2

在C中,二維數組的存儲方式與線性數組類似,但是它們使用雙指針進行索引。也就是說,如果我們定義爲什麼編譯器不將int [] []轉換爲int **,這在理論上是可行的?

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}. 

a第一點,像

{p1 = 0x7fff5fbffb58 , p2 = 0x7fff5fbffb70, p3 = 0x7fff5fbffb88} 

然後p1點至1,p2點到4點p3至7

那麼爲什麼不t編譯器允許從二維數組轉換爲雙指針,這在理論上是可行的?儘管二維數組可以一個接一個地存儲,但索引信息總是可以傳遞給任意的雙指針。

+0

對於二維數組,編譯器不存儲中間指針,假想的'p1','p2'和'p3'。對於錯誤的假設,爲 – 2012-01-27 11:01:42

+0

-1。這在理論上是不可能的。 **數組不是指針!** – 2012-01-27 14:06:29

回答

9

這在理論上是不可能的。 2d數組不使用雙指針索引 - 編譯器將其轉換爲一個索引。例如,如果您有int a[3][5],並且您訪問a[i][j],則編譯器將其轉換爲((int[])a)[5*i+j]。 (你的解釋是完全錯誤的)

因爲所有這一切,如果你想將int[][]轉換爲int**,你需要分配內存來保存所有子數組的地址,並獲取它的地址。只是(int**)a將無法​​正常工作。

+0

我明白了!所以像double(* y)[3] = a這樣的東西實際上是從一個二維數組轉換爲一個充滿指針的列表! – Strin 2012-01-28 13:02:11

+0

沒有。它將它「轉換」爲指向數組的指針。由於您可以像訪問數組一樣訪問指針,因此可以像訪問2D數組那樣訪問y。 – asaelr 2012-01-28 16:50:51

0

int[][]轉換爲int**將需要引入數組的指針數組。我們愛c沒有明確要求時不採取這種自由。

1

你的例子說明了爲什麼編譯器不能做到這一點的理由:p1值,p2p3計算,不存儲。編譯器知道p1的地址,並在掌握數組大小的知識的情況下計算另外兩個。另一方面,在雙指針的情況下,所有三個指針需要在連續的存儲器位置中存儲,形成指針數組。

0

因爲C這樣說。

(C99,6.3.2.1p3)「除了當它是sizeof操作或一元& 操作者的操作數,或是用於初始化數組文本的字符串,其具有鍵入一個表達式」陣列類型「被轉換爲類型爲」指向類型的指針「的表達式,該表達式指向數組對象的初始元素,並且不是左值。」

此轉換規則對於數組數組不是遞歸的。

類型int [N][M]的對象的值在轉換後的類型爲int (*)[M]

0

因爲是兩回事。 int a [3] [3],在內存中是數組的9個元素。 int **你應該有一個3個元素的指針數組,每個指針指向另一個數組,它將包含數據。

相關問題