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

时间:2015-05-12 09:56:35

标签: c arrays pointers

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

2 个答案:

答案 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*