最近我在C
进行了采访。面试官要我解释
如何使用2D array
访问double pointer
中的特定元素。我给出的答案为*(*(a+i)+j)
,其中a
是双指针,i
是行数,j
是列数。后来他让我用一个例子来解释。我对*(a+i)
感到困惑,因为它给出了值而不是地址,并且添加到j
会给出一些垃圾值。
任何人都可以解释一下。
答案 0 :(得分:6)
请记住,在一维数组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];
答案 1 :(得分:3)
a [i] [j]元素看起来像
A [i] [j] = *(*(A + I)+ j)的
所以它是一个双指针,因为它首先确定行然后是列,因为你可以看到2d矩阵看起来像
----- _________________
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
实际上你可以看到一维保存另一个一维矩阵的地址。所以第一个垂直矩阵数据类型是int**
,因为它将地址保持为另一维int*