使用双指针访问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*