2016-02-04 158 views
-1

假設我們有以下的2維數組:爲什麼說一個2維數組是一個「指向指針的指針?」

int multi[3][3]; 

據我瞭解,我們可以說,multi是一個「指針的指針」,或者 - 至少是 - 我們可以這樣做的followiong:

int **p_p_int = multi; 

問題:我們爲什麼不說multi是一個「指針的指針的指針的指針」,因爲向其第一元素的地址multi點,這本身就指向一個點呃,它指向地址multi[0][0],它本身指向的值爲multi[0][0]

這似乎是對象指出(這裏我指望地址作爲指針)。

現在你可能會說「但地址不是指針,即使指針可以等於地址」,在這種情況下,它也似乎很奇怪,說2維數組是「指針指針」,因爲它是實際上是一個指向地址的指針,指向一個地址(指向一個值)。

我覺得我mananaged迷惑自己頗有幾分這裏:)

+0

'int multi [3] [3];'衰變爲'int * [3]',就這樣。 –

+2

只因爲你可以說出來,並不是真的。 –

+0

@BenjaminLindley那有什麼不對? –

回答

2

一維數組轉換爲一個指針,而不是一個 - 例如你可以重新分配一個指針,你不能重新分配一個數組。

文字2d數組不按以下方式存儲。

int **array2d是一個指針:

然而2D陣列可以由指針如果可以實現的指針。它指向一個數組。該數組包含指針。

因爲array2d指向一個指針數組,所以array2d[n]也是一個指針。但它是一個指向整數數組的指針。

這就是兩個指針,總數。

在僞代碼中,步驟仰視(M,N)的項目是:

  • 加入M到array2d到索引數組。從計算出的地址讀取指針,p;
  • 將n加到p來索引該數組。從計算出的地址讀取整數。
+0

我認爲你用'int multi [3] []'(一個int [3]'的數組)混淆了'int * multi []'(一個'int *'的數組)。在這兩種情況下,'multi [x] [y]'是一個'int',但其他的都不一樣。第二個是真正的二維數組。 – rici

+0

我認爲所有令人困惑的是,我已經重複使用'multi'作爲我的變量名稱。我想我已經明確了爲什麼二維數組可以通過指針指針存儲,但這不是內置的二維數組。 – Tommy

+0

什麼是'array2d'? 'multi'是一個數組,但它不包含指針。 –

1

說的是multipointer to a pointer就是錯的。它是一個二維數組。 multi不能轉換到一** - 只*

pointer to pointer顯然指向的指針。 multi沒有這樣做。您會在該位置找到一個整數 - 不是指針 - 因爲multi不是指針數組。multi[n]也可以轉換爲*但換算值不從它被存儲的地方採取 - 它只是從multi計算。

不要以爲一個二維數組一樣的:

int a[3]; 
int b[3]; 
int c[3]; 
int* x[3] = {a, b, c}; 

原因就是根本不數組如何2D工作。

您從一個二維數組獲得所有指針值計算出的值 - 不是存儲的值。

+0

'multi'不能轉換爲'**'。 –

+0

@BenjaminLindley:'(int **)multi'是一個合法的表達,但它的價值沒有意義。 –

+0

@ BenjaminLindley - 謝謝你指出,因爲它是一個錯誤的陳述 - 回答更新。 – 4386427

0

我認爲這裏有兩個不相關的東西,你混合起來:

  1. 的任何類型的數組名T[][][]...n...[] decayes爲T*[][][]...n-1...[]
    例如:
    int arr [7] decayes到int* arr
    std::fstream arr[2][2]衰變爲std::fstream* arr[2]

通過衰減,我們的意思是一個函數可以得到T還可以接受T'T'是腐爛類型的T

  • 可以動態利用指針的指針和動態allcoation創建僞2個維陣列

    int** psuedeo2DimArray = new int*[10]; 
    for (auto i=0U;i<10;i++){ 
        psuedeo2DimArray[i] = new int[10]; 
    } 
    
  • 在所有情況下,multi的類型是int[2][2],沒有別的。

    2

    指針的工作是朝東西點。僅僅因爲一些既是一個指針和指向別的東西並不能使一個指針的指針,除非有其它東西的指針。

    讓我們打破這:

    多點朝它的第一個元素的地址,

    這使得它的指針

    本身指向一個指針,

    這使得AP ointer到的指針。

    指向朝向多[0] [0],

    號的它包含的multi[0][0]地址的地址,它不指向它。

    本身指向多[0] [0]

    井的價值,當然。這是一個指針,指向價值的指針,這是他們的工作。這不會使它們指向指針,它使它們指向值。

    這似乎是指向4個對象(這裏我將地址指向指針)。

    當然,但其中兩個指針是相同的指針,只是計數兩次。你說X is a pointer that contains a value that points to something就好像這是兩個單獨的指示。指針的工作就是要有一個指向某個東西的值,這就是使它成爲第一個指針的原因。這是說同一事物的兩種方式,「X是一個指針」=「X包含一個指向某物的值(類型)」。

    相關問題