Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用双指针访问二维数组元素_C_Arrays_Pointers - Fatal编程技术网

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]