2015-05-12 79 views
1

最近我在C進行了一次採訪。面試官要求我解釋如何使用double pointer訪問2D array中的特定元素 。我給出了答案*(*(a+i)+j),其中a是一個雙指針,i是行數,j是列數。後來他讓我用一個例子來解釋。我對*(a+i)感到困惑,因爲它給出了價值而不是地址,並增加了j給出了一些垃圾價值。 任何人都可以請解釋。使用雙指針訪問2D數組元素

回答

5

請記住,在1D陣列a[i]等於*(a+i)。 C中沒有2D數組,只是數組的數組。因此a[i][j]實際上等於*(*(a+i)+j)

如果a的類型是int**,那麼(a+i)的類型仍然是int**,您需要對其進行解引用。 *(a+i)的類型是int*,並且*(*(a+i)+j)的類型是int

關於面試問題,不管那個a是一個雙指針,你仍然應該使用[]表示法。另一種方法是太麻煩:

int **a = ...; 
int x = a[i][j]; 
+0

在指針概念中,*(a + i)表示第i行的地址 – WallPoster

+0

*「C中沒有2D數組」 *有些不正確。雙指針'int ** a;'可以作爲二維數組與數組的方法,但'int a [N] [M];'是真正的二維數組。 – user694733

+0

@ user694733:那麼,這是一個定義問題。 'int a [N] [M]'可以被看作是一個2D數組或者是一個由'int [M]'類型的N值組成的數組,這是一個數組數組。其他具有真正二維數組的語言將使用'a [i,j]'而不是'a [i] [j]'。 – rodrigo

2

的A [1] [j]的元素看起來像

一個[i] [j] = *(*(A + I)+ j)的

所以這是一個雙指針,因爲它會先判斷該行,然後列,因爲你可以看到的二維矩陣看起來像

-----  _________________ 
|___| ---> |___|____|____|___| 
|___| ---> |___|____|____|___| 
|___| ---> |___|____|____|___| 
|___| ---> |___|____|____|___| 

實際上你可以看到一個維度是另一維矩陣的地址。因此,第一個垂直矩陣數據類型是int**,因爲它保存了另一個一維的地址,即int*