使用双指针访问2D数组元素

最近我在C面试了一次。 面试官让我解释如何使用double pointer访问2D array特定元素。 我给出答案为*(*(a+i)+j) ,其中a是双指针, i是行数, j是列数。 后来他让我用一个例子来解释。 我对*(a+i)感到困惑,因为它给出了值而不是地址,并且添加到j给出了一些垃圾值。 任何人都可以解释。

请记住,在一维数组中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]; 

a [i] [j]元素看起来像

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

所以它是一个双指针,因为它首先确定行然后是列,因为你可以看到2d矩阵看起来像

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

实际上你可以看到一维保存另一个一维矩阵的地址。 所以第一个垂直矩阵数据类型是int**因为它保存地址另一个一维,即int*