C 使用双指针访问二维数组元素
最近我在C 使用双指针访问二维数组元素,c,arrays,pointers,C,Arrays,Pointers,最近我在C上接受了一次采访。面试官让我解释一下 如何使用双指针访问2D数组中的特定元素。我的答案是*(*(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**,您需要取消对它的引
C
上接受了一次采访。面试官让我解释一下
如何使用双指针访问2D数组中的特定元素
。我的答案是*(*(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]元素看起来像
----- _________________
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
a[i][j]=*(*(a+i)+j)
所以它是一个双指针,因为它首先确定行,然后确定列,正如您看到的2d矩阵所示
----- _________________
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
|___| ---> |___|____|____|___|
实际上你可以看到一个一维矩阵,它包含另一个一维矩阵的地址。因此,第一个垂直矩阵数据类型是
int**
,因为它包含地址另一个一维,即int*
“C中没有2D数组”有点不正确。双指针int**a
可用作数组数组方法的二维数组,但int a[N][M]
是真的2D数组。@user694733:好吧,这是定义问题int a[N][M]
可以看作是一个2D数组,或者是一个类型为int[M]
的N个值的数组,即数组数组。其他具有真正2D数组的语言将使用a[i,j]
而不是a[i][j]
。